Python unicode重音符号a(a)十六进制

2024-09-29 19:31:23 发布

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

我有一个来自bs4的字符串

s = "vinili-disponibili/311-canzoniere-del-lazio-lassa-st\u00c3\u00a0-la-me-creatura.html"

\u00c3\u00a0应该是重音a(a),我已经让它在控制台中显示部分正确为

^{pr2}$

str2 = u'%s' % s
print(str2.encode('utf-8').decode('unicode-escape'))

但是它是分开解码c3和a0,所以我得到了一个波浪号a而不是重音a。我知道c3 a0是重音a的十六进制utf-8。我不知道发生了什么,我使用谷歌和组合方法得到了答案。整个字符编码对我来说好像一团糟。在

它应该是这样的

311-canzoniere-del-lazio-lassa-stà-la-me-creatura.html

编辑: Andrey的方法在打印出来时是有效的,但是尝试使用urlopen和我得到的字符串UnicodeEncodeError: 'ascii' codec can't encode character '\xe0' in position 60: ordinal not in range(128)

使用unquote(str,":/")后,它给出UnicodeEncodeError: 'ascii' codec can't encode characters in position 56-57: ordinal not in range(128)。在


Tags: 字符串inhtmllaencodemestdel
2条回答

使用.encode('latin-1')将字符串转换回字节,然后解码unicode转义符\u,再次使用“错误”'latin-1'编码将所有内容转换为字节,最后,将“正确”解码为'utf-8'

s = "vinili-disponibili/311-canzoniere-del-lazio-lassa-st\u00c3\u00a0-la-me-creatura.html"
s.encode('latin-1').decode('raw_unicode_escape').encode('latin-1').decode('utf-8')

给出:

^{pr2}$

它的工作原理与this answer中解释的相同。在

假设Python 2:

这是一个带Unicode转义符的字节字符串。为某些UTF-8编码的数据错误地生成了Unicode转义符:

>>> s = "vinili-disponibili/311-canzoniere-del-lazio-lassa-st\u00c3\u00a0-la-me-creatura.html"
>>> s.decode('unicode-escape')
u'vinili-disponibili/311-canzoniere-del-lazio-lassa-st\xc3\xa0-la-me-creatura.html'

现在它是一个Unicode字符串,但是现在由于代码点类似于UTF-8字节而出现了错误解码。它将输出latin1(也叫iso-8859-1)编解码器将前256个代码点直接映射到字节0-255,因此使用以下技巧将其转换回字节字符串:

^{pr2}$

现在可以正确解码为UTF-8:

>>> s.decode('unicode-escape').encode('latin1').decode('utf8')
u'vinili-disponibili/311-canzoniere-del-lazio-lassa-st\xe0-la-me-creatura.html'

它是一个Unicode字符串,因此Python显示它的repr()值,它将U+007F以上的代码点显示为转义代码。print如果终端正确配置了支持打印字符的编码,则可以查看实际值:

>>> print(s.decode('unicode-escape').encode('latin1').decode('utf8'))
vinili-disponibili/311-canzoniere-del-lazio-lassa-stà-la-me-creatura.html

理想情况下,首先解决错误地生成此字符串的问题,而不是解决混乱的问题。在

相关问题 更多 >

    热门问题