使用Perl,
$ perl -e 'print "\xca"' > out
现在是$ xxd out我们有
$ xxd out
00000000: ca
但对于巨蟒我尝试过
$ python3 -c 'print("\xca", end="")' > out $ xxd out
我得到的是
00000000: c38a
我不知道发生了什么事。
wvmv3b1j1#
在Python中,str对象是一系列的unicode代码点,如何将其打印到屏幕上取决于sys.stdout的编码,这是根据您的语言环境(或者可能有各种环境变量会影响它,但默认情况下,它是您的语言环境)选择的,因此您的语言环境必须设置为UTF-8,这也是我的默认设置:
str
sys.stdout
(py311) Juans-MBP:~ juan$ locale LANG="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_CTYPE="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_ALL= (py311) Juans-MBP:~ juan$ python -c "print('\xca', end='')" | xxd 00000000: c38a
但是,如果我重写我的locale并告诉它使用en_US.ISO8859-1(latin-1),一种单字节编码,我们会得到您所期望的结果:
en_US.ISO8859-1
(py311) Juans-MBP:~ juan$ LC_ALL="en_US.ISO8859-1" python -c "print('\xca', end='')" | xxd 00000000: ca
如果你需要原始字节,解决方案是使用原始字节,在Python源代码中,方法是使用字节常量(或者字符串常量,然后.encode它),我们可以在sys.stdout.buffer使用原始缓冲区:
.encode
sys.stdout.buffer
(py311) Juans-MBP:~ juan$ python -c "import sys; sys.stdout.buffer.write(b'\xca')" | xxd 00000000: ca
或者通过将字符串编码为bytes对象:
(py311) Juans-MBP:~ juan$ python -c "import sys; sys.stdout.buffer.write('\xca'.encode('latin'))" | xxd 00000000: ca
1l5u6lss2#
在python中\xca被解释为两字节字符串在UTF-8编码中,这就是为什么当一个值写入文件时,它会自动将文件中的两个字节存储为c3 8a但是在perl中\xca被解释为一个十六进制值为0xca的单字节,因此当该值存储在文件中时,它将不编码保存。
c3 8a
You can check more details
2条答案
按热度按时间wvmv3b1j1#
在Python中,
str
对象是一系列的unicode代码点,如何将其打印到屏幕上取决于sys.stdout
的编码,这是根据您的语言环境(或者可能有各种环境变量会影响它,但默认情况下,它是您的语言环境)选择的,因此您的语言环境必须设置为UTF-8,这也是我的默认设置:但是,如果我重写我的locale并告诉它使用
en_US.ISO8859-1
(latin-1),一种单字节编码,我们会得到您所期望的结果:如果你需要原始字节,解决方案是使用原始字节,在Python源代码中,方法是使用字节常量(或者字符串常量,然后
.encode
它),我们可以在sys.stdout.buffer
使用原始缓冲区:或者通过将字符串编码为bytes对象:
1l5u6lss2#
在python中\xca被解释为两字节字符串在UTF-8编码中,这就是为什么当一个值写入文件时,它会自动将文件中的两个字节存储为
c3 8a
但是在perl中\xca被解释为一个十六进制值为0xca的单字节,因此当该值存储在文件中时,它将不编码保存。
You can check more details