在 python 中按行读取二进制文件是否会导致 unicode 数据出现问题?
Does reading a binary file linewise in python cause problems for unicode data?
我正在 python3 中读取一个大的 (10Gb) bzip 文件,它是 utf-8 编码的 JSON。不过,我只想要几行,它们以一组特定的字节开头,因此为了避免将所有行解码为 unicode,我正在 'rb' 模式下读取文件,如下所示:
with bz2.open(filename, 'rb') as file:
for line in file:
if line.startswith(b'Hello'):
#decode line here, then do stuff
但是我突然想到,如果其中一个unicode字符包含与换行符相同的字节怎么办?通过执行 for line in file
我会冒被截断的行的风险吗?或者二进制文件上的按行迭代器仍然神奇地工作吗?
逐行迭代适用于 UTF-8 编码数据。
不是魔术,而是设计:
UTF-8 的创建是为了向后兼容 ASCII。
ASCII 仅使用字节值 0 到 127,将可能值的上半部分留给任何类型的扩展。
UTF-8 利用了这一点,因为 ASCII 之外的任何 Unicode 代码点都使用 128..255.
范围内的字节进行编码
例如,字母“Ċ”(上面带点的大写字母 C)具有 Unicode 代码点值 U+010A
。
在 UTF-8 中,这是用字节序列 C4 8A
编码的,因此不使用字节 0A
,这是 ASCII 换行符。
相反,UTF-16 编码与 0A 01
或 01 0A
相同的字符(取决于 Endianness)。
所以我猜 UTF-16 不安全地进行逐行迭代。
虽然它不像文件编码那么常见。
我正在 python3 中读取一个大的 (10Gb) bzip 文件,它是 utf-8 编码的 JSON。不过,我只想要几行,它们以一组特定的字节开头,因此为了避免将所有行解码为 unicode,我正在 'rb' 模式下读取文件,如下所示:
with bz2.open(filename, 'rb') as file:
for line in file:
if line.startswith(b'Hello'):
#decode line here, then do stuff
但是我突然想到,如果其中一个unicode字符包含与换行符相同的字节怎么办?通过执行 for line in file
我会冒被截断的行的风险吗?或者二进制文件上的按行迭代器仍然神奇地工作吗?
逐行迭代适用于 UTF-8 编码数据。 不是魔术,而是设计: UTF-8 的创建是为了向后兼容 ASCII。
ASCII 仅使用字节值 0 到 127,将可能值的上半部分留给任何类型的扩展。 UTF-8 利用了这一点,因为 ASCII 之外的任何 Unicode 代码点都使用 128..255.
范围内的字节进行编码例如,字母“Ċ”(上面带点的大写字母 C)具有 Unicode 代码点值 U+010A
。
在 UTF-8 中,这是用字节序列 C4 8A
编码的,因此不使用字节 0A
,这是 ASCII 换行符。
相反,UTF-16 编码与 0A 01
或 01 0A
相同的字符(取决于 Endianness)。
所以我猜 UTF-16 不安全地进行逐行迭代。
虽然它不像文件编码那么常见。