Python UTF-16编码十六进制表示

时间:2012-06-25 21:12:09

标签: python string file utf-16 utf

我在Python 2.7.2中有一个字符串,说你是“\ u0638”。 当我把它写到文件:

f = open("J:\\111.txt", "w+")
f.write(u"\u0638".encode('utf-16'))
f.close()

在十六进制中,它看起来像:FF FE 38 06 当我将这样的字符串打印到stdout时,我会看到:'\ xff \ xfe8 \ x06'。

querstion: 输出到stdout的字符串中的\ x38在哪里?换句话说,为什么输出到stdout的字符串不是'\ xff \ xfe \ x38 \ X06' ?

如果我将字符串写入文件两次:

f = open("J:\\111.txt", "w+")
f.write(u"\u0638".encode('utf-16'))
f.write(u"\u0638".encode('utf-16'))
f.close()

文件中的十六进制表示包含字节顺序标记(BOM)\ xff \ xfe 两次:FF FE 38 06 FF FE 38 06

我想知道在UTF-16编码的字符串中避免写BOM的技术是什么?

3 个答案:

答案 0 :(得分:5)

ASCII字符8具有十六进制表示0x38。所以你的字符串:

\xff\xfe8\x06

四个字节长。用空格分隔,字节为:

\xff \xfe 8 \x06

Python对不代表可打印ASCII字符的字节使用\x表示法。

答案 1 :(得分:3)

编码为“utf-16le”或“utf-16be”(小端或大端)应跳过编写BOM。当然,如果没有BOM,解码器需要知道期望的字节顺序。

答案 2 :(得分:1)

\xff\xfe8\x06 包含\x388 == \x38

对于第二个问题,要避免使用BOM,如果您明确表示字节顺序(使用UTF-16BEUTF-16LE编解码器),则不会打印BOM。

但是,正确的做法是使用一个文件包装器来处理编码和解码,并在程序中使用unicode。在Python 3.0中,open内置函数可以执行此操作:

fp = open(filename, 'w', encoding='utf-16')
fp.write(u'write one line\n')
fp.write(u'write another line\n')
fp.close()

在Python 2.x中,使用编解码器包装器:

fp = codecs.open(filename, 'w', 'utf-16')
fp.write(u'write one line\n')
fp.write(u'write another line\n')
fp.close()