Как получить все символы произвольной кодировки? - PullRequest
0 голосов
/ 13 сентября 2018

Если я хочу узнать, какие буквы являются частью набора символов ascii, я могу просто спросить python, что приятно:

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

Я искал некоторое время, но не смог найти универсальную функциюкоторый возвращает кодировки произвольных кодировок.Примерно так:

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

Или я просто пропустил это?Функция, которая проверяет, содержит ли строка только символы некоторой кодировки, тоже будет работать, но я хотел бы, чтобы интуитивно понятным было просто иметь все допустимые символы в виде списка.

1 Ответ

0 голосов
/ 13 сентября 2018

Насколько я знаю, в стандартной библиотеке такой функции не существует.

В отсутствие лучшей идеи, вот уродливый хак, который пытается кодировать каждый отдельный символ в диапазоне 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)
...