Python-Unicode到ASCII的转换

2024-09-26 22:11:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

u'ABRA\xc3O JOS\xc9'

我试过encodedecode但他们不会这么做。

有人有什么建议吗?


Tags: 数据asciiunicode情况建议encodedecodejos
2条回答

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')反转)。

有关详细信息,请参见^{}Python Specific EncodingsUnicode HOWTO


顺便说一下,当有些人说“ASCII”时,他们实际上不是指“ASCII”,而是指“ASCII的超集的任何8位字符集”或“我想到的某个特定的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位字符串的代码和使用8位字符串的代码,并且您不太清楚,那么您的意思是UTF-8。如果使用8位字符串的代码是open函数或为页面或其他内容提供服务的web浏览器,则事情会更复杂,如果没有更多信息,就没有简单的答案。

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

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

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

相关问题 更多 >

    热门问题