如何使用Python遍历给定编码中的每个字符?

5
有没有一种方法可以迭代给定编码中的每个字符并打印其代码?比如说,UTF8?
4个回答

7

伙计,你知道Unicode中有多少个代码点吗...

顺便说一下,从Python文档中得知:

chr( i )

返回表示Unicode代码点为整数i的字符的字符串。例如,chr(97)返回字符串'a',而chr(8364)返回字符串'€'。这是ord()的反函数。

参数的有效范围是从0到1,114,111(16进制中的0x10FFFF)。如果i超出该范围,将引发ValueError异常。

所以

import sys

for i in range(sys.maxunicode + 1):
    char = chr(i)
    print(repr(char))  # print('\ud800') causes a UnicodeEncodeError

1
这就是为什么我不想手动做它的原因 :) - Geo
2
你也不想自动地完成它,因为它超过一百万个字符,需要一棵树才能打印出来,事实上这本书被称为 Unicode 标准书 ;) - wich
5
所以,不要打印它 :) 现在我们并不是所有的电脑都直接连接到线打印机上 :) 超过一百万?你需要一种像电脑这样的机器来处理那么多数据! :) - Ian Clelland

6

所有Unicode字符都可以用所有定义的 UTF-n 表示。你想实现什么?

如果您真的想做类似打印特定编码中所有有效字符的事情,而不需要知道编码是“单字节”还是“多字节”,或者它的大小是否固定:

import unicodedata as ucd
import sys

def dump_encoding(enc):
    for i in xrange(sys.maxunicode):
        u = unichr(i)
        try:
            s = u.encode(enc)
        except UnicodeEncodeError:
            continue
        try:
            name = ucd.name(u)
        except:
            name = '?'
        print "U+%06X %r %s" % (i, s, name)

if __name__ == "__main__":
    dump_encoding(sys.argv[1])

建议:从一些小的东西开始尝试,比如cp1252。将标准输出重定向到文件中。

1
我正在使用 Python 3.7。
import unicodedata as ucd
import sys

def dump_encoding(enc):
    for i in range(sys.maxunicode):
        u = chr(i)
        try:
            s = u.encode(enc)
        except UnicodeEncodeError:
            continue
        try:
            name = ucd.name(u)
        except:
            name = '?'
        print (i, s, u, name)

if __name__ == "__main__":
    sys.getdefaultencoding()
    dump_encoding(sys.argv[1])

请确保您使用正确的Python版本运行脚本,并且需要一个参数:

python3.7 ./iterate_over_charset.py utf-8 > unicode_all.txt

样例输出:

4473 b'\xe1\x85\xb9' ᅹ HANGUL JUNGSEONG YA-YO
4474 b'\xe1\x85\xba' ᅺ HANGUL JUNGSEONG EO-O
4475 b'\xe1\x85\xbb' ᅻ HANGUL JUNGSEONG EO-U
4476 b'\xe1\x85\xbc' ᅼ HANGUL JUNGSEONG EO-EU
4477 b'\xe1\x85\xbd' ᅽ HANGUL JUNGSEONG YEO-O
4478 b'\xe1\x85\xbe' ᅾ HANGUL JUNGSEONG YEO-U
4479 b'\xe1\x85\xbf' ᅿ HANGUL JUNGSEONG O-EO
4480 b'\xe1\x86\x80' ᆀ HANGUL JUNGSEONG O-E
4481 b'\xe1\x86\x81' ᆁ HANGUL JUNGSEONG O-YE

1

对于单字节编码,您可以使用:

''.join(chr(x) for x in range(256)).decode(encoding, 'ignore')

获取包含给定编码中所有有效字符的字符串。

对于固定大小的多字节编码,小心使用 struct.pack() 替代 chr() 应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接