Python与Perl通过print重定向写入字节的输出差异问题
问题:Perl与Python输出字节差异原因分析?
使用Perl执行以下命令:
$ perl -e 'print "\xca"' > out
执行xxd out后输出:
00000000: ca
但使用Python执行类似命令:
$ python3 -c 'print("\xca", end="")' > out $ xxd out
得到的输出却是:
00000000: c38a
请问出现该差异的原因是什么?
原因分析
- Perl的字符串默认是字节串:Perl没有严格区分字节串和Unicode字符串,默认情况下
"\xca"会被直接解析为十六进制值0xca对应的单字节,print会直接把这个字节写入文件,没有额外编码步骤,因此输出文件中就是单个0xca字节。 - Python3的字符串是Unicode序列:Python3里的字符串默认是Unicode字符,
"\xca"代表的是Unicode字符Ë(U+00CA)。当print输出时,Python会将该Unicode字符按照当前环境的默认编码(通常为UTF-8)进行编码。U+00CA的UTF-8编码结果就是双字节序列0xc3 0x8a,这就是xxd输出c38a的原因。
如果需要让Python输出和Perl一致的单字节0xca,可以直接操作字节串:
# 方法1:通过字节串解码后输出 $ python3 -c 'print(b"\xca".decode("latin-1"), end="")' > out # 方法2:直接写入字节到标准输出缓冲区 $ python3 -c 'import sys; sys.stdout.buffer.write(b"\xca")' > out
执行上述任一命令后,xxd out都会输出00000000: ca。
内容的提问来源于stack exchange,提问作者Guanwei HU
相关产品推荐
相关产品推荐

