我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII:
u'ABRA\xc3O JOS\xc9'
我试过了encode
,decode
他们不会这样做。
有人有建议吗?
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.encode
有关更多信息,请参阅Python 特定编码和Unicode HOWTO。
作为旁注,当有些人说“ASCII”时,他们实际上并不是指“ASCII”,而是“作为 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 浏览器或其他东西,那么事情会更加复杂,如果没有更多信息,就没有简单的答案。
我需要计算收到MD5 hash
的. MD5 给出并且 python 内置编码方法不起作用,因为它用对应的字符替换字符串中的字符,从而改变. 所以我想出了以下代码,它在从.unicode string
HTTP request
UnicodeEncodeError
hex values
MD5 hash
unicode
unicode_string = ''.join([chr(ord(x)) for x in unicode_string]).strip()
这将从字符串中删除unicode
部分并保持所有数据完整。
我发现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 '