15

我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII:

u'ABRA\xc3O JOS\xc9'

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

有人有建议吗?

4

3 回答 3

40

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 浏览器或其他东西,那么事情会更加复杂,如果没有更多信息,就没有简单的答案。

于 2013-10-22T20:13:58.810 回答
0

我需要计算收到MD5 hash的. MD5 给出并且 python 内置编码方法不起作用,因为它用对应的字符替换字符串中的字符,从而改变. 所以我想出了以下代码,它在从.unicode stringHTTP requestUnicodeEncodeErrorhex valuesMD5 hashunicode

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

这将从字符串中删除unicode部分并保持所有数据完整。

于 2019-08-27T11:58:15.980 回答
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 '
于 2021-03-10T07:57:14.423 回答