Python2.7, что означают специальные символы в выводе кодировки utf-32 строки unicode?

Я играл с юникодом и методами кодирования Python, я использовал специальный символ «‽» и китайский символ, чтобы увидеть, как разные кодировки utf работают с этими символами, и я получаю эти выходные данные.

>>> a = u"‽"
>>> encoded_a = a.encode('utf-32')
>>> a
u'\u203d'
>>> encoded_a
'\xff\xfe\x00\x00= \x00\x00'
>>> b = u"安"
>>> encoded_b = b.encode('utf-32')
>>> b
u'\u5b89'
>>> encoded_b
'\xff\xfe\x00\x00\x89[\x00\x00'

Мой вопрос: что означает знак равенства и квадратная скобка в закодированном результате?


person David Zheng    schedule 18.05.2016    source источник


Ответы (3)


Когда вы печатаете repr строки байтов, любое значение байта в диапазоне от \x20 до \x7e будет преобразовано в эквивалентное печатаемый символ ASCII. В этом случае = совпадает с \x3d, а [ совпадает с \x5b. Вы пропустили пробел, который равен \x20.

Вот полная таблица:

\x20 ' '    \x21 '!'    \x22 '"'    \x23 '#'
\x24 '$'    \x25 '%'    \x26 '&'    \x27 '''
\x28 '('    \x29 ')'    \x2a '*'    \x2b '+'
\x2c ','    \x2d '-'    \x2e '.'    \x2f '/'
\x30 '0'    \x31 '1'    \x32 '2'    \x33 '3'
\x34 '4'    \x35 '5'    \x36 '6'    \x37 '7'
\x38 '8'    \x39 '9'    \x3a ':'    \x3b ';'
\x3c '<'    \x3d '='    \x3e '>'    \x3f '?'
\x40 '@'    \x41 'A'    \x42 'B'    \x43 'C'
\x44 'D'    \x45 'E'    \x46 'F'    \x47 'G'
\x48 'H'    \x49 'I'    \x4a 'J'    \x4b 'K'
\x4c 'L'    \x4d 'M'    \x4e 'N'    \x4f 'O'
\x50 'P'    \x51 'Q'    \x52 'R'    \x53 'S'
\x54 'T'    \x55 'U'    \x56 'V'    \x57 'W'
\x58 'X'    \x59 'Y'    \x5a 'Z'    \x5b '['
\x5c '\'    \x5d ']'    \x5e '^'    \x5f '_'
\x60 '`'    \x61 'a'    \x62 'b'    \x63 'c'
\x64 'd'    \x65 'e'    \x66 'f'    \x67 'g'
\x68 'h'    \x69 'i'    \x6a 'j'    \x6b 'k'
\x6c 'l'    \x6d 'm'    \x6e 'n'    \x6f 'o'
\x70 'p'    \x71 'q'    \x72 'r'    \x73 's'
\x74 't'    \x75 'u'    \x76 'v'    \x77 'w'
\x78 'x'    \x79 'y'    \x7a 'z'    \x7b '{'
\x7c '|'    \x7d '}'    \x7e '~'

Ваши две строки на самом деле '\xff\xfe\x00\x00\x3d\x20\x00\x00' и '\xff\xfe\x00\x00\x89\x5b\x00\x00'.

person Mark Ransom    schedule 18.05.2016

"\xff\xfe\x00\x00" — это неблокирующий пробел нулевой ширины, более известный как маркер порядка байтов (BOM). Удивительно, почему Python вставляет это в строку, но я уверен, что есть способ запросить только кодировку данной строки, а не префикс для других программ, чтобы распознать это как UTF-32.

Далее следуют байты 3d, 20 и еще два нуля, которые представляют кодовую точку 203d в порядке байтов с прямым порядком байтов. 3d, интерпретируемый как ASCII, становится знаком равенства, а 20 становится символом пробела.

person Ulrich Eckhardt    schedule 18.05.2016
comment
Python вставляет спецификацию, если вы используете кодировку, длина которой превышает 8 бит, без указания порядка следования байтов. Чтобы потерять спецификацию, используйте 'utf-32le' или 'utf-32be'. - person Mark Ransom; 19.05.2016

Первые два шестнадцатеричных кодирования представляют спецификацию или метку порядка байтов. Глядя на документацию Python для Unicode, может показаться, что символы, которые вы видите, являются переводом шестнадцатеричная кодировка. Я смотрю на один из примеров, представленных в документации, который, похоже, делает то же самое, что и вы, и распечатывает перевод:

8 >>> unistring.encode('utf-16')
9 '\xff\xfeH\x00i\x00\n\x00'
person K. Erik Wolfe    schedule 18.05.2016