2014-02-20 50 views
0

我有一个函数,它以Unicode \u05D4\u...作为变量str获取编码的字符串,并且我想将该Unicode更改为字母,以便此str将包含翻译的字符串。在Python中解码Unicode

我该怎么办?

+3

不要命名变量str。它是python中的一个类型 –

+0

你的命名是倒退的;你的字符串是Unicode的,它已经有了字母。你想*编码成字节。 – RemcoGerlich

+0

我强烈建议你阅读和/或观看http://nedbatchelder.com/text/unipain.html(如果他们以前没有看到这个网站,这个方法可以让所有人看到这个问题) – geoffspear

回答

1

实际上有两个我们可以在这里处理的字符串类型。

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

这就是它看起来像在Python:

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

实际上,你可以只打印此屏幕,因为Python的打印功能通常使用支持该编码。 (我相信这是sys.stdout.encoding)

>>> print x 
ᄩᄩ 

如果你想编码这个,你应该使用UTF-8编码,它支持所有已知的Unicode字符。但是,您仍需要打印功能才能将其打印为可读的字符。

但是,这种字符串很容易打印!我怀疑你会有任何麻烦输出到屏幕上。这就是为什么我相信你有第二个字符串类型:


第二种类型的字符串是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指定了不同的一种逃避:

为了躲避扩展的字符不在基本多 平面中,字符表示为一个12个字符的序列, 编码UTF-16代理对。因此,例如,仅包含G谱号字符(U + 1D11E)的字符串 可以表示为 “\ uD834 \ uDD1E”。

因此,请确保您知道您的数据来自哪里!

+1

请注意,在第二种情况下,有许多使用'\ u'转义的不同格式 - Python unicode文字(unicode-escape处理),Java属性,JavaScript字符串文字,JSON等等。了解你处理的是哪一个是很重要的,因为它们对于其他转义是否有效都有稍微不同的规则。 'unicode-escape'可能是也可能不是解析这些数据的有效方式,这取决于它来自何处。 – bobince

+0

@bobince谢谢,我不知道。增加了更多信息。增加了一些链接。抛弃了我对Unicode的梦想,这是一个神奇的统一标准。 – icedtrees

-2

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

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

现在,这里有趣。您在示例中引用的序列不映射到拉丁语-1编码中的任何合法字符,因此我建议您始终指定'替换'作为错误处理程序。即:

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

注:

我看到的字符集旨在为希伯来语

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

我不愿意'不要冒犯任何人。 OP没有指定编码。我猜测在Windows拉丁-1 - 演示如何编码。然后我对它进行了测试,并且看到它没有完全编码为latin-1,所以我展示了一个错误处理的例子。但是现在我被标记为不敏感,因为我以某种方式读取了他的想法或将每个编解码器都记录在内存中? – user590028

0

编码字符串作为分配Unicode和使用print正确提示转义字符:

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

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

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

>> xx