有没有一种方法可以迭代给定编码中的每个字符并打印其代码?比如说,UTF8?
伙计,你知道Unicode中有多少个代码点吗...
顺便说一下,从Python文档中得知:
返回表示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
所有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
。将标准输出重定向到文件中。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
对于单字节编码,您可以使用:
''.join(chr(x) for x in range(256)).decode(encoding, 'ignore')
获取包含给定编码中所有有效字符的字符串。
对于固定大小的多字节编码,小心使用 struct.pack()
替代 chr()
应该可以工作。