gpt4 book ai didi

Python:解码由unicode代码点和unicode文本组成的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 10:19:08 25 4
gpt4 key购买 nike

解析一些 HTML 内容我得到以下字符串:

АБВ\u003d\"res

处理它的常见建议似乎是使用 unicode_escape 进行解码。但是,这会导致以下结果:

ÐÐÐ="res

转义字符被正确解码,但西里尔字母由于某种原因被破坏。除了使用正则表达式提取所有看起来像 unicode 字符串的内容,使用 unicode_escape 仅对其进行解码,然后将所有内容放入一个新字符串之外,还有哪些其他方法可以在 Python 中解码具有 unicode 代码点的字符串?

最佳答案

unicode_escape 将输入视为 Latin-1 编码;任何不代表 Python 字符串文字转义序列的字节都被解码,将字节直接映射到 Unicode 代码点。你给了它 UTF-8 字节,所以西里尔字符用 2 个字节表示,每个字节被解码为两个 Latin-1 字符,其中一个是 U+00D0 Ð,另一个不可打印:

>>> print repr('АБВ\\u003d\\"res')
'\xd0\x90\xd0\x91\xd0\x92\\u003d\\"res'
>>> print repr('АБВ\\u003d\\"res'.decode('latin1'))
u'\xd0\x90\xd0\x91\xd0\x92\\u003d\\"res'
>>> print 'АБВ\\u003d\\"res'.decode('latin1')
ÐÐÐ\u003d\"res

这种错误解码称为 Mojibake ,并且可以通过重新编码为 Latin-1,然后从正确的编解码器(在您的情况下为 UTF-8)解码来修复:

>>> print 'АБВ\u003d\\"res'.decode('unicode_escape')
ÐÐÐ="res
>>> print 'АБВ\u003d\\"res'.decode('unicode_escape').encode('latin1').decode('utf8')
АБВ="res

请注意,如果 \uhhhh 转义序列编码的代码点超出 Latin-1 范围 (U+0000-U+00FF),这将失败

上面的 Python 3 等价物使用 codecs.encode() :

>>> import codecs
>>> codecs.decode('АБВ\\u003d\\"res', 'unicode_escape').encode('latin1').decode('utf8')
'АБВ="res'

关于Python:解码由unicode代码点和unicode文本组成的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33485255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com