如何获取任意编码的所有字符?

7

如果我想知道哪些字母是ascii字符集的一部分,我可以简单地询问Python,这很方便:

>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

我搜索了一段时间,但找不到返回任意编码字符集的通用函数。类似于这样:

>>> import string
>>> string.get_charset('latin1')  # doesn't exist =(
'abc ... äöü ...'

还是我错过了?检查字符串是否只包含某种编码字符的功能也可以,但我更喜欢将所有有效字符作为列表直观地呈现出来。

1个回答

4
据我所知,标准库中没有这样的函数。
如果没有更好的想法,这里有一个丑陋的hack方法,它尝试用指定的编码对utf8范围内的每个字符进行编码,并删除无法编码的字符:
def get_charset(encoding):
    all_chars = ''.join(chr(x) for x in range(0x110000))
    return all_chars.encode(encoding, errors='ignore').decode(encoding)

输出:

>>> get_charset('latin-1')
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0¡¢£¤¥¦§¨©ª«¬\xad®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

速度测试:

In [2]: %timeit get_charset('latin1')
306 ms ± 8.34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

注意:此解决方案可能会错过一些可能性。Unicode代码点不是字符。您可能还需要查看组合代码。好处是:Unicode的首要任务之一是能够在转换时不丢失信息。因此,大多数重要编解码器(1990年之前)应该可以正常工作。对于围绕Unicode起源开发的某些亚洲编码,您可能会遗漏一些字符。 - Giacomo Catenazzi

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