首先,我知道在 Python 2.x 中存在大量有关字符串编码/解码的问题,但我似乎无法找到该问题的解决方案。
我有一个 unicode 字符串,其中包含字母
č
,表示为 \u00c4\u008d
如果在Python控制台中我写
>>> a = u"\u00c4\u008d"
>>> print a
我打印出两个奇怪的字符而不是
č
,可能是因为该字符串的实际编码应该是UTF-8。因此我尝试使用 .decode("utf-8")
但为此我得到了标准 UnicodeEncodeError
。
你知道我如何让 Python 在控制台中将该字符串打印为
č
吗?
非常感谢
č
不由 u'\u00c4\u008d'
表示。 这两个十六进制值是 UTF-8 编码值,因此应以字节字符串形式编写为 '\xc4\x8d'
。 示例:
>>> s = '\xc4\x8d'
>>> s.decode('utf8')
u'\u010d'
>>> print(s.decode('utf8'))
č
警告:您的终端必须配置支持正确打印字符的编码,否则您将看到
UnicodeEncodeError
。
如果由于某种原因您的 Unicode 字符串解码错误,您可以利用 Unicode 的前 256 个代码点与
latin1
编码相关的事实并修复它:
>>> s = u'\u00c4\u008d'
>>> s.encode('latin1')
'\xc4\x8d'
>>> s.encode('latin1').decode('utf8')
u'\u010d'
>>> print(s.encode('latin1').decode('utf8'))
č
如果您的 Unicode 字符串解码错误,您应该显示您拥有的文件或读取该文件的代码并解决该问题。
在与 python 战斗了一个多小时后,我决定寻找另一种语言的解决方案。这就是我在 C# 中实现目标的方法:
var s = "\u00c4\u008d";
var newS = Encoding.UTF8.GetString(Encoding.Default.GetBytes(s));
File.WriteAllText(@"D:\tmp\test.txt", newS, Encoding.UTF8);
终于!该文件现在包含
č
。
因此,我受到 C# 中这种方法的启发,并设法在 Python 中提出以下(看似)等效的解决方案:
>>> s = u"\u00c4\u008d"
>>> arr = bytearray(map(ord, s))
>>> print arr.decode("utf-8")
č
我不确定这个解决方案有多好,但它似乎适用于我的情况。
对于几年后在 Python3 中看到这个问题的人:
>>> s = b'\xc4\x8d'
>>> s.decode('utf8')
'č'