我有一个来自bs4的字符串
s = "vinili-disponibili/311-canzoniere-del-lazio-lassa-st\u00c3\u00a0-la-me-creatura.html"
\u00c3\u00a0
应该是重音a(a),我已经让它在控制台中显示部分正确为
与
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)
。在
使用
.encode('latin-1')
将字符串转换回字节,然后解码unicode转义符\u
,再次使用“错误”'latin-1'
编码将所有内容转换为字节,最后,将“正确”解码为'utf-8'
:给出:
^{pr2}$它的工作原理与this answer中解释的相同。在
假设Python 2:
这是一个带Unicode转义符的字节字符串。为某些UTF-8编码的数据错误地生成了Unicode转义符:
现在它是一个Unicode字符串,但是现在由于代码点类似于UTF-8字节而出现了错误解码。它将输出
^{pr2}$latin1
(也叫iso-8859-1
)编解码器将前256个代码点直接映射到字节0-255,因此使用以下技巧将其转换回字节字符串:现在可以正确解码为UTF-8:
它是一个Unicode字符串,因此Python显示它的
repr()
值,它将U+007F以上的代码点显示为转义代码。print
如果终端正确配置了支持打印字符的编码,则可以查看实际值:理想情况下,首先解决错误地生成此字符串的问题,而不是解决混乱的问题。在
相关问题 更多 >
编程相关推荐