首先,我知道有很多关于Python 2.x中字符串的编码/解码的问题,但我似乎无法找到解决这个问题的方法。
我有一个unicode字符串,其中包含字母Error occurred during build: Failed to retrieve https://s3.amazonaws.com/FILE: HTTP Error 403 : <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ID</RequestId><HostId>ID</HostId></Error>
,表示为č
如果在Python控制台中我写
\u00c4\u008d
我打印出两个奇怪的字符而不是>>> a = u"\u00c4\u008d"
>>> print a
,可能是因为该字符串的实际编码应该是UTF-8。因此,我尝试使用č
,但为此我获得了标准.decode("utf-8")
。
您知道如何让Python在控制台中将该字符串打印为UnicodeEncodeError
吗?
非常感谢
答案 0 :(得分:2)
č
未由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字符串,您应该显示您拥有的文件或读取它的代码并解决该问题。
答案 1 :(得分:0)
与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")
č
我不确定这个解决方案有多好,但它似乎适用于我的情况。