我在玩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'
我的问题是,在编码结果中,等号和等号括号意味着什么?
发布于 2016-05-18 21:56:49
打印字节字符串的repr
时,通过\x7e
在\x20
范围内的任何字节值都将转换为等效的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'
。
发布于 2016-05-18 21:41:13
"\xff\xfe\x00\x00"
是一个零宽度、无阻塞的空间字符,以其作为字节顺序标记(BOM)而闻名.我不明白为什么Python会将它插入到字符串中,但我确信有一种方法可以只请求给定字符串的编码,而不是其他程序识别为UTF-32的前缀。
后面是字节3d、20和另外两个空值,它们以小的endian字节顺序表示代码点203d。当解释为ASCII时,3d成为等号,20成为空间字符。
发布于 2016-05-18 20:15:40
前两个十六进制编码表示BOM,或Byte Order Mark。查看Unicode的Python文档,您看到的字符似乎是十六进制编码的转换。我正在查看文档中提供的示例之一,它似乎在做与您正在做的相同的事情,并且正在打印译文:
8 >>> unistring.encode('utf-16')
9 '\xff\xfeH\x00i\x00\n\x00'
https://stackoverflow.com/questions/37308565
复制相似问题