在 python 中按行读取二进制文件是否会导致 unicode 数据出现问题?

Does reading a binary file linewise in python cause problems for unicode data?

我正在 python3 中读取一个大的 (10Gb) bzip 文件,它是 utf-8 编码的 JSON。不过,我只想要几行,它们以一组特定的字节开头,因此为了避免将所有行解码为 un​​icode,我正在 '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 0101 0A 相同的字符(取决于 Endianness)。 所以我猜 UTF-16 不安全地进行逐行迭代。 虽然它不像文件编码那么常见。