在Python中解码Unicode

时间:2014-02-20 13:07:23

标签: python string unicode

我有一个函数,它将Unicode \u05D4\u...中的字符串编码为变量str,我想将该Unicode更改为字母,以便此str将包含已翻译的字符串

我该怎么做?

4 个答案:

答案 0 :(得分:1)

我们可以在这里处理两种类型的字符串。

第一个是 Python Unicode字符串,其中字符串已经是一组unicode点。

这就是Python中的样子:

>>> x = u"\u1129\u1129"
>>> x
u'\u1129\u1129'

您实际上只需将其打印到屏幕上,因为Python打印功能通常使用支持此功能的编码。 (我相信它是sys.stdout.encoding)

>>> print x
ᄩᄩ

如果您希望对此进行编码,则应该使用utf-8编码,该编码支持所有已知的Unicode字符。但是,您仍然需要使用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)和八个字符来转义扩展字符。

>>> print "\\U0001D11E".decode("unicode-escape")

>>> print u"\U0001D11E"

但是rfc指定了另一种逃避:

  

转义不在Basic Multilingual中的扩展字符   平面,角色表示为十二个字符的序列,   编码UTF-16代理对。所以,例如,一个字符串   只包含G谱号字符(U + 1D11E)可以表示为   “\ uD834 \ uDD1E”。

因此,请确保您知道数据的来源!

答案 1 :(得分:0)

在分配时将字符串编码为unicode,并使用print正确提示转义字符:

>>> s = u'\u05D4\u...'
>>> print s
ה

答案 2 :(得分:0)

使用u'..'声明一个unicode字符串并使用UTF-8对其进行编码(UTF-8是一种可以代表Unicode字符集中每个字符的可变宽度编码)。

#!/usr/bin/evn python
a = u'\05D4\05D4'
print a.encode(utf-8')

>> xx

答案 3 :(得分:-2)

如果您有Unicode字符串,并且想要将其转换为可显示的字符,则需要选择编码。我假设您要在终端和运行窗口上显示它?

ustr = u'\u05D5'
print ustr.encode('latin-1')

现在这里有点搞笑。您在示例中引用的序列不会映射到latin-1编码中的任何合法字符,因此我建议您始终将“replace”指定为错误处理程序。即:

print ustr.encode('latin-1', 'replace')

注:

我看到字符集是希伯来语

print ustr.encode('hebrew', 'replace') # alias for iso8859_8