将原始字节写入 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)
所以,我有这段代码:
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)