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

5 投票
4 回答
4228 浏览
提问于 2025-04-15 18:13

有没有办法遍历给定编码中的每一个字符,并打印出它的编码值?比如说,UTF8编码?

4 个回答

1

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

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

这样可以得到一个包含所有在这个编码中有效字符的字符串。

对于固定大小的多字节编码,仔细使用 struct.pack() 来代替 chr() 应该是可行的。

6

兄弟,你知道Unicode里有多少个字符编码点吗...

顺便提一下,来自Python文档的内容:

chr( i )

这个函数会返回一个字符串,表示Unicode编码点为整数i的字符。比如,chr(97)会返回字符串'a',而chr(8364)会返回字符串'€'。这个函数的作用正好和ord()相反。

这个函数的参数有效范围是从0到1,114,111(在十六进制中是0x10FFFF)。如果i超出了这个范围,就会抛出ValueError错误。

所以

import sys

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

所有的Unicode字符都可以用UTF-n来表示,适用于所有定义的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。把标准输出重定向到一个文件里。

撰写回答