Python UTF16编码十六进制表示法

2024-10-01 13:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python2.7.2中有一个字符串说u“\u0638”。 当我将其写入文件时:

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

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

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

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

^{pr2}$

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

我想知道有什么技术可以避免用UTF-16编码的字符串编写BOM?


Tags: 文件字符串txtstdoutopenbomencodewrite
3条回答

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

\xff\xfe8\x06

长度为四个字节。以空格分隔的字节为:

^{pr2}$

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

\xff\xfe8\x06是否包含\x388==\x38。在

对于您的第二个问题,为了避免BOM,如果您明确表示了endianness(使用UTF-16BEUTF-16LE编解码器),则不会打印BOM。在

但是,正确的做法是使用一个文件包装器来处理编码和解码,并在程序中使用unicode。在Python3.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中,使用编解码器包装:

^{pr2}$

编码到“utf-16le”或“utf-16be”(小端或大端)应该跳过编写BOM。当然,在没有BOM的情况下,解码器需要知道预期的尾数。在

相关问题 更多 >