gpt4 book ai didi

python - 如何迭代 Python 3 中的 Unicode 字符?

转载 作者:太空狗 更新时间:2023-10-29 17:31:41 24 4
gpt4 key购买 nike

我需要一次一个字符地遍历 Python 字符串,但是一个简单的“for”循环却给了我 UTF-16 代码单元:

str = "abc\u20ac\U00010302\U0010fffd"
for ch in str:
code = ord(ch)
print("U+{:04X}".format(code))

打印:

U+0061
U+0062
U+0063
U+20AC
U+D800
U+DF02
U+DBFF
U+DFFD

当我想要的是:

U+0061
U+0062
U+0063
U+20AC
U+10302
U+10FFFD

有没有办法让 Python 给我 Unicode 代码点的序列,而不管字符串实际上是如何编码的?我在这里在 Windows 上进行测试,但我需要可以在任何地方运行的代码。它只需要在 Python 3 上工作,我不关心 Python 2.x。

到目前为止我能想到的最好的是:

import codecs
str = "abc\u20ac\U00010302\U0010fffd"
bytestr, _ = codecs.getencoder("utf_32_be")(str)
for i in range(0, len(bytestr), 4):
code = 0
for b in bytestr[i:i + 4]:
code = (code << 8) + b
print("U+{:04X}".format(code))

但我希望有更简单的方法。

(对精确的 Unicode 术语的迂腐吹毛求疵将被四分之一的线索无情地打在头上。我想我已经清楚地说明了我在这里的目的,请不要浪费空间“但 UTF -16 在技术上也是 Unicode”类型的论点。)

最佳答案

在具有窄 Unicode 构建的 Python 3.2.1 上:

PythonWin 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32.
Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> import sys
>>> sys.maxunicode
65535

您发现了什么(UTF-16 编码):

>>> s = "abc\u20ac\U00010302\U0010fffd"
>>> len(s)
8
>>> for c in s:
... print('U+{:04X}'.format(ord(c)))
...
U+0061
U+0062
U+0063
U+20AC
U+D800
U+DF02
U+DBFF
U+DFFD

解决方法:

>>> import struct
>>> s=s.encode('utf-32-be')
>>> struct.unpack('>{}L'.format(len(s)//4),s)
(97, 98, 99, 8364, 66306, 1114109)
>>> for i in struct.unpack('>{}L'.format(len(s)//4),s):
... print('U+{:04X}'.format(i))
...
U+0061
U+0062
U+0063
U+20AC
U+10302
U+10FFFD

Python 3.3 更新:

现在它按照 OP 期望的方式工作:

>>> s = "abc\u20ac\U00010302\U0010fffd"
>>> len(s)
6
>>> for c in s:
... print('U+{:04X}'.format(ord(c)))
...
U+0061
U+0062
U+0063
U+20AC
U+10302
U+10FFFD

关于python - 如何迭代 Python 3 中的 Unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7494064/

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