Python - Unicode到ASCII转换

时间:2013-10-22 20:05:57

标签: python unicode encoding ascii

我无法将以下Unicode转换为ASCII而不会丢失数据:

u'ABRA\xc3O JOS\xc9'

我尝试了encodedecode,他们不会这样做。

有人有建议吗?

3 个答案:

答案 0 :(得分:37)

Unicode字符u'\xce0'u'\xc9'没有任何相应的ASCII值。因此,如果您不想丢失数据,则必须以某种有效的ASCII格式对数据进行编码。选项包括:

>>> print s.encode('ascii', errors='backslashreplace')
ABRA\xc3O JOS\xc9
>>> print s.encode('ascii', errors='xmlcharrefreplace')
ABRAÃO JOSÉ
>>> print s.encode('unicode-escape')
ABRA\xc3O JOS\xc9
>>> print s.encode('punycode')
ABRAO JOS-jta5e

所有这些都是ASCII字符串,并且包含原始Unicode字符串中的所有信息(因此它们都可以在不丢失数据的情况下被反转),但是对于最终用户来说,它们都不是那么漂亮(并且没有它们可以通过decode('ascii'))来反转。

有关详细信息,请参阅str.encodePython Specific EncodingsUnicode HOWTO


作为旁注,当有人说“ASCII”时,它们实际上不是指“ASCII”,而是“任何8位字符集,它是ASCII的超集”或“某些特定的8位字符集”我记得“。如果这就是您的意思,解决方案是编码为正确的8位字符集:

>>> s.encode('utf-8')
'ABRA\xc3\x83O JOS\xc3\x89'
>>> s.encode('cp1252')
'ABRA\xc3O JOS\xc9'
>>> s.encode('iso-8859-15')
'ABRA\xc3O JOS\xc9'

困难的部分是知道你的意思是哪个字符集。如果您正在编写生成8位字符串的代码和使用它的代码,并且您不知道更好,那么您的意思是UTF-8。如果使用8位字符串的代码是,例如,open函数或您正在为页面提供服务的Web浏览器或其他内容,则事情会更复杂,并且没有很多简单的答案更多信息。

答案 1 :(得分:0)

我需要计算MD5 hash中收到的unicode string中的HTTP request。 MD5给出了UnicodeEncodeError,而python内置编码方法不起作用,因为它用相应的hex values替换了字符串中的字符,从而改变了MD5 hash。 因此,我想出了以下代码,该代码在从unicode转换时使字符串保持完整。

unicode_string = ''.join([chr(ord(x)) for x in unicode_string]).strip()

这将从字符串中删除unicode部分,并使所有数据保持不变。

答案 2 :(得分:0)

我发现https://pypi.org/project/Unidecode/这个库非常有用

>>> from unidecode import unidecode
>>> unidecode('ko\u017eu\u0161\u010dek')
'kozuscek'
>>> unidecode('30 \U0001d5c4\U0001d5c6/\U0001d5c1')
'30 km/h'
>>> unidecode('\u5317\u4EB0')
'Bei Jing '