【问题标题】:Python UTF-16 encoding hex representationPython UTF-16 编码十六进制表示
【发布时间】:2012-06-27 04:28:57
【问题描述】:

我在 Python 2.7.2 中有一个字符串说 u"\u0638"。 当我将其写入文件时:

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

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

问题: 输出到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 的技术是什么?

【问题讨论】:

    标签: python string file utf-16 utf


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        \xff\xfe8\x06
        

        4 个字节长。以空格分隔,字节为:

        \xff \xfe 8 \x06
        

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

        【讨论】:

        • 换一种说法:'\x38' == '8'
        • 如果原始问题中的示例是u'\u063a',答案会更加明显。
        猜你喜欢
        • 2020-01-18
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 2012-05-10
        • 2014-08-07
        • 2015-12-06
        • 1970-01-01
        相关资源
        最近更新 更多