将unicode字符串转换为utf-8

时间:2018-04-24 14:21:39

标签: python unicode encoding utf-8

首先,我知道有很多关于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吗?

非常感谢

2 个答案:

答案 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")
č

我不确定这个解决方案有多好,但它似乎适用于我的情况。