Python2.7、unicode字符串的utf-32编码输出中的特殊字符是什么意思?
Python2.7, what does the special characters mean in the utf-32 encoding output of a unicode string?
我在玩弄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'
我的问题是等号和等号在编码结果中是什么意思?
前两个十六进制编码表示 BOM,即字节顺序标记。查看 Python documentation for Unicode ,您看到的字符似乎是十六进制编码的翻译。我正在查看文档中提供的示例之一,它似乎在做与您相同的事情并且正在打印翻译:
8 >>> unistring.encode('utf-16')
9 '\xff\xfeH\x00i\x00\n\x00'
"\xff\xfe\x00\x00"
是一个零宽度、非阻塞 space 字符,因其用作字节顺序标记 (BOM) 而广为人知。打败我为什么 Python 将它插入到字符串中,但我确信有一种方法可以只请求给定字符串的编码,而不是其他程序将其识别为 UTF-32 的前缀。
接下来是字节 3d、20 和另外两个空值,它们代表小端字节顺序的代码点 203d。 3d,当解释为 ASCII 时,变成等号,20 变成 space 字符。
当您打印字节字符串的 repr
时,\x20
到 \x7e
范围内的任何字节值都将转换为等效的 ASCII printable character。在这种情况下,=
与 \x3d
相同,[
与 \x5b
相同。您错过了 space,即 \x20
。
这是完整的 table:
\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'
.
我在玩弄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'
我的问题是等号和等号在编码结果中是什么意思?
前两个十六进制编码表示 BOM,即字节顺序标记。查看 Python documentation for Unicode ,您看到的字符似乎是十六进制编码的翻译。我正在查看文档中提供的示例之一,它似乎在做与您相同的事情并且正在打印翻译:
8 >>> unistring.encode('utf-16')
9 '\xff\xfeH\x00i\x00\n\x00'
"\xff\xfe\x00\x00"
是一个零宽度、非阻塞 space 字符,因其用作字节顺序标记 (BOM) 而广为人知。打败我为什么 Python 将它插入到字符串中,但我确信有一种方法可以只请求给定字符串的编码,而不是其他程序将其识别为 UTF-32 的前缀。
接下来是字节 3d、20 和另外两个空值,它们代表小端字节顺序的代码点 203d。 3d,当解释为 ASCII 时,变成等号,20 变成 space 字符。
当您打印字节字符串的 repr
时,\x20
到 \x7e
范围内的任何字节值都将转换为等效的 ASCII printable character。在这种情况下,=
与 \x3d
相同,[
与 \x5b
相同。您错过了 space,即 \x20
。
这是完整的 table:
\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'
.