python - unicode字节序让我困惑

标签 python encoding utf-8 endianness ucs2

我以三种不同的形式编辑了三个具有相同内容“你”(英文是you)的文件--gbk\utf-8\ucs-2,gedit名为“ok1,好的2,好的3”。

>>> f1 = open('ok1', 'rb').read()
>>> f2 = open('ok2', 'rb').read()
>>> f3 = open('ok3', 'rb').read()
>>> f1
'\xc4\xe3\n'
>>> f2
'\xe4\xbd\xa0\n'
>>> f3
'`O\n\x00'
>>> hex(ord("`"))
'0x60'
>>> hex(ord("O")) 
'0x4f'

事实上 f3 是 '\x60\x4f', 但是下面的输出让我很困惑

>>> '\xe4\xbd\xa0'.decode("utf-8")
u'\u4f60'
>>> '\xc4\xe3'.decode("gbk")
u'\u4f60'
>>> 

为什么只有ucs-2(或者说unicode)有字节序问题,utf-8没有,gbk没有?

最佳答案

UTF-8GBK 以字节序列存储数据。在这些编码中,明确定义了哪个字节值在哪个字节之后。此字节顺序不会随着编码、传输或解码中使用的架构而改变。

另一方面,UCS-2 或新的 UTF-16 以 2 字节序列存储数据。这些 2 字节 token 中各个字节的顺序是 endianness,它取决于底层机器架构。在与以 UCS-2 编码的数据通信之前,系统必须就如何识别 token 的字节顺序达成一致。

在您的情况下,Unicode 点 U+4F60 在 UCS-2 中编码为单个 2 字节标记 0x4F60。由于您的机器在内存对齐中将最低有效字节放在最高有效字节之前,因此序列 ('0x60', '0x4F') 已放入文件中。因此,文件读取将按此顺序产生字节。

Python 仍然可以正确解码此数据,因为它会在形成 2 字节 token 之前以正确的顺序读取字节:

>>> '`O\n\x00'.decode('utf-16')
u'\u4f60\n'

关于python - unicode字节序让我困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12328740/

相关文章:

python - 如何在 pyCharm 上打开脚本的语法突出显示?

python - Django 休息框架 : convert queryset to json response

python 字符串格式 { :d} vs %d on floating point number

python - 如何避免松弛命令超时错误?

jQuery tmpl : How do I render Html?

unicode - 手动将 unicode 代码点转换为 UTF-8 和 UTF-16

python - 无法运行 pip : UnicodeDecodeError

mysql - 编码和整理之间的区别?

c++ - 在 Windows 上获取 boost::filesystem::path 作为 UTF-8 编码的 std::string

python - 在django中将utf-8字符输出为json