将原始字节写入 Python3 中的文件会导致意外输出

Writing raw bytes to a file in Python3 results in unexpected output

所以,我有这段代码:

f = open("crash.txt", "w")
junk = ("\xCC" * 1028)
f.write(junk)
f.close()

当我在 Windows(3.5.1) 上 运行 时,我得到一个包含重复 "CC"s 作为十六进制字符的文件。符合预期。

但是,运行在 Linux(Python 3.4.2) 上,我得到重复的 "c38c"s 作为十六进制字符。

我不明白 Linux 上的输出。为什么会发生这种情况,我该如何解决。

您不是在写入原始字节。默认情况下 Python 3 使用 Unicode 字符串,并且必须对这些字符串进行编码才能将它们写入文件。同样默认情况下,open() 使用文本模式,用于编码文本的编码是 locale.getpreferredencoding()。在美国 Windows,即 cp1252,但在 Linux,通常是 utf8

b'\xc3\x8c''\xcc'utf8 中编码。

b'\xcc''\xcc' 编码为 cp1252

以二进制模式打开文件并写入字节字符串而不是 Unicode 写入 "raw" 字节。

with open("crash.txt", "wb") as f:
    junk = b"\xCC" * 1028
    f.write(junk)