Python2.7,unicode字符串的utf-32编码输出中的特殊字符是什么意思?

时间:2016-05-18 19:30:53

标签: python unicode encoding utf

我正在使用python的unicode和编码方法,我使用特殊字符“‽”和一个中文字符来查看不同的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'

我的问题是编码结果中等号和等号括号的含义是什么?

3 个答案:

答案 0 :(得分:2)

"\xff\xfe\x00\x00"是一个零宽度,非阻塞空格字符,以其用作字节顺序标记(BOM)而闻名。打败我为什么Python将其插入到字符串中,但我确信有一种方法只能请求给定字符串的编码,而不是其他程序的前缀来将其识别为UTF-32。

接着是字节3d,20和另外两个空值,它们以小端字节顺序表示代码点203d。 3d,当解释为ASCII时,变为等号,20变为空格字符。

答案 1 :(得分:1)

当您打印字节字符串的repr时,\x20\x7e范围内的任何字节值都将转换为等效的ASCII printable character。在这种情况下,=\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'

答案 2 :(得分:0)

前两个十六进制编码表示BOM或字节顺序标记。查看Python documentation for Unicode,您看到的字符似乎是十六进制编码的翻译。我正在查看文档中提供的一个示例,这些示例似乎正在执行相同的操作并打印出翻译:

8 >>> unistring.encode('utf-16')
9 '\xff\xfeH\x00i\x00\n\x00'