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

Arn*_*rne 7 python unicode character-encoding python-3.x

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

>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
Run Code Online (Sandbox Code Playgroud)

我搜索了一会儿,但找不到返回任意编码字符集的泛型函数.像这样的东西:

>>> import string
>>> string.get_charset('latin1')  # doesn't exist =(
'abc ... äöü ...'
Run Code Online (Sandbox Code Playgroud)

还是我错过了?检查字符串是否只包含某些编码字符的函数也可以使用,但我希望将所有有效字符作为列表的直观性.

Ara*_*Fey 4

据我所知,标准库中不存在这样的函数。

\n\n

由于缺乏更好的想法,这里有一个丑陋的黑客尝试使用指定的编码对 utf8 范围中的每个字符进行编码,并删除那些无法编码的字符:

\n\n
def get_charset(encoding):\n    all_chars = \'\'.join(chr(x) for x in range(0x110000))\n    return all_chars.encode(encoding, errors=\'ignore\').decode(encoding)\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n
>>> get_charset(\'latin-1\')\n\'\\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\xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\\xad\xc2\xae\xc2\xaf\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

速度测试:

\n\n
In [2]: %timeit get_charset(\'latin1\')\n306 ms \xc2\xb1 8.34 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n