Как я могу перебрать каждый символ в данной кодировке, используя Python? - PullRequest
2 голосов
/ 20 января 2010

Есть ли способ перебирать каждый символ в заданной кодировке и печатать его код?Скажи, UTF8?

Ответы [ 4 ]

4 голосов
/ 20 января 2010

Все символы 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. Перенаправить стандартный вывод в файл.

4 голосов
/ 20 января 2010

чувак, ты не представляешь, сколько кодовых точек в юникоде ...

кстати, из документов Python:

unichr (i)

Возвращает строку Unicode одного символа, чей код Unicode является целым числом i.Например, unichr (97) возвращает строку u'a '.Это обратное значение ord () для строк Unicode.Допустимый диапазон для аргумента зависит от того, как был настроен Python - это может быть либо UCS2 [0..0xFFFF], либо UCS4 [0..0x10FFFF].ValueError повышается в противном случае.Для ASCII и 8-битных строк см. Chr ().

Новое в версии 2.0.

Итак

import sys
for i in xrange(sys.maxunicode + 1):
    print unichr(i)
1 голос
/ 17 сентября 2018

Я использую python3.7

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
1 голос
/ 20 января 2010

Для однобайтовых кодировок вы можете использовать:

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

, чтобы получить строку, содержащую все действительные символы в данной кодировке.

Для многобайтовых кодировок фиксированного размера осторожно использоватьstruct.pack() вместо chr() должно работать.

...