实际上我们可以在这里处理两种类型的字符串。
第一个是 Python Unicode 字符串,其中字符串已经是一组 unicode 点。
这就是它在 Python 中的样子:
>>> x = u"\u1129\u1129"
>>> x
u'\u1129\u1129'
您实际上可以将其打印到屏幕上,因为 Python 打印函数通常使用支持此的编码。 (我相信是sys.stdout.encoding)
>>> print x
ᄩᄩ
如果您希望对此进行编码,您可能应该使用支持所有已知 Unicode 字符的 utf-8 编码。但是,您仍然需要 print 函数将其打印为可读字符。
但是,这种字符串很容易打印!我怀疑您将其输出到屏幕上会有任何问题。这就是为什么我相信你有第二种类型的字符串:
第二种类型的字符串是 Unicode 转义字符串,它可以在 Java .properties 文件之类的东西中找到(它们会强制您使用一些单字节的 ascii 编码变体)。这就是它在 Python 中的样子:
>>> escapedString = "\\u05D4\\u05D4\\u05D4"
>>> print escapedString
\u05D4\u05D4\u05D4
然后因为设计这些文件的人不知道Unicode and the basic essentials of character encoding,所以我们的工作就是将这些转义的代码点变成可读的字符。
>>> pythonUnicode = escapedString.decode("unicode-escape")
# This turns escaped unicode code points into Python unicode code points
>>> print pythonUnicode
ההה
看起来我们有可读的字符!
但是,如果您有超出基本多语言平面(U+0 到 U+FFFF)的字符,您应该小心。有多种方法可以对超出基本两个字节的字符进行编码。例如:
Python 使用 \U(注意大写 U)和 8 个字符转义扩展字符。
>>> print "\\U0001D11E".decode("unicode-escape")
?
>>> print u"\U0001D11E"
?
但rfc 指定了另一种转义:
转义不在基本多语言中的扩展字符
平面,字符表示为十二个字符的序列,
编码 UTF-16 代理对。因此,例如,一个字符串
仅包含 G 谱号字符 (U+1D11E) 可以表示为
“\uD834\uDD1E”。
所以请确保您知道您的数据来自哪里!