gpt4 book ai didi

python - unicode Python 字符串中的字节数

转载 作者:IT老高 更新时间:2023-10-28 21:54:51 29 4
gpt4 key购买 nike

在 Python 2 中,Unicode 字符串可能同时包含 unicode 和字节:

a = u'\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \xd0\xb5\xd0\xba'

我知道这绝对是不应该在自己的代码中编写,但这是我必须处理的字符串。

上面字符串中的字节是 ек 的 UTF-8 (Unicode \u0435\u043a)。

我的目标是获取包含 Unicode 中所有内容的 unicode 字符串,也就是说 Русский ек (\u0420\u0443\u0441\u0441\u043a\u0438\u0439\u0435\u043a)。

将其编码为 UTF-8 产生

>>> a.encode('utf-8')
'\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xc3\x90\xc2\xb5\xc3\x90\xc2\xba'

然后从 UTF-8 解码得到带有字节的初始字符串,这不好:

>>> a.encode('utf-8').decode('utf-8')
u'\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \xd0\xb5\xd0\xba'

我找到了一个解决问题的方法,但是:

>>> repr(a)
"u'\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \\xd0\\xb5\\xd0\\xba'"
>>> eval(repr(a)[1:])
'\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \xd0\xb5\xd0\xba'
>>> s = eval(repr(a)[1:]).decode('utf8')
>>> s
u'\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \u0435\u043a'
# Almost there, the bytes are proper now but the former real-unicode characters
# are now escaped with \u's; need to un-escape them.
>>> import re
>>> re.sub(u'\\\\u([a-f\\d]+)', lambda x : unichr(int(x.group(1), 16)), s)
u'\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u0435\u043a' # Success!

这很好用,但由于使用了 evalrepr 以及对 unicode 字符串表示的附加正则表达式,因此看起来很 hacky。有没有更清洁的方法?

最佳答案

In Python 2, Unicode strings may contain both unicode and bytes:

不,他们可能不会。它们包含 Unicode 字符。

在原始字符串中,\xd0 不是 UTF-8 编码的字节。它是代码点为 208 的 Unicode 字符。u'\xd0' == u'\u00d0'。碰巧的是,Python 2 中 Unicode 字符串的 repr 更喜欢在可能的情况下使用 \x 转义来表示字符(即代码点 < 256)。

没有办法查看字符串并告诉 \xd0 字节应该是某些 UTF-8 编码字符的一部分,或者它是否实际上代表该 Unicode 字符本身.

但是,如果您假设您始终可以将这些值解释为编码值,您可以尝试编写依次分析每个字符的内容(使用 ord 转换为代码点整数),将 < 256 的字符解码为 UTF-8,并按原样传递 >= 256 的字符。

关于python - unicode Python 字符串中的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845842/

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