Python3以一种奇怪的方式处理非ASCII字符

Python3以一种奇怪的方式处理非ASCII字符,python,python-3.x,unicode,ascii,non-ascii-characters,Python,Python 3.x,Unicode,Ascii,Non Ascii Characters,我试图用Python3解决一个问题。为此,我需要打印一些不在ASCII范围内的字符 Python3正在将这些字符转换成某种奇怪的Unicode 例如,如果我在Python 3中打印“\xff”,我会得到以下结果: root@kali:~# python3 -c 'print("\xff")' | xxd 00000000: c3bf 0a ... \xff转换为\xc3\xbf 但在Python2中,它的工作原理与预期一样,如下

我试图用Python3解决一个问题。为此,我需要打印一些不在ASCII范围内的字符

Python3正在将这些字符转换成某种奇怪的Unicode

例如,如果我在Python 3中打印
“\xff”
,我会得到以下结果:

root@kali:~# python3 -c 'print("\xff")' | xxd
00000000: c3bf 0a                                  ...
\xff
转换为
\xc3\xbf

但在Python2中,它的工作原理与预期一样,如下所示:

root@kali:~# python -c 'print("\xff")' | xxd
00000000: ff0a                                     ..

那么,如何在Python 3中像这样打印它呢?

在Python 2中,
str
字节
是同一件事,所以当您编写
'\xff'
时,结果包含实际的字节
0xFF

在Python3中,
str
更接近Python2的
unicode
对象,并且不是
字节的别名
\xff
不再是一个插入字节的请求,而是一个插入Unicode字符的请求,该字符的代码可以用8位表示。字符串以默认编码(可能是UTF-8)打印,其中字符0xFF编码为字节
\xc3\xbf
\x
基本上是
\u
以字符串形式出现时的单字节版本。但是,当它出现在
字节中时,仍然与以前一样

现在是一个解决方案。如果您只需要一些字节,请执行以下操作

b'\xff'
这与Python2中的工作原理相同。您可以将这些字节写入二进制文件,但无法直接打印,因为您打印的所有内容都转换为
str
。打印的问题是所有内容都以文本模式编码。幸运的是,它有一个
缓冲区
属性,可以让您直接输出
字节

sys.stdout.buffer.write(b'\xff\n')

只有在Python 2中,
str
bytes
是一样的,所以当您编写
'\xff'
时,结果包含实际的字节
0xFF

在Python3中,
str
更接近Python2的
unicode
对象,并且不是
字节的别名
\xff
不再是一个插入字节的请求,而是一个插入Unicode字符的请求,该字符的代码可以用8位表示。字符串以默认编码(可能是UTF-8)打印,其中字符0xFF编码为字节
\xc3\xbf
\x
基本上是
\u
以字符串形式出现时的单字节版本。但是,当它出现在
字节中时,仍然与以前一样

现在是一个解决方案。如果您只需要一些字节,请执行以下操作

b'\xff'
这与Python2中的工作原理相同。您可以将这些字节写入二进制文件,但无法直接打印,因为您打印的所有内容都转换为
str
。打印的问题是所有内容都以文本模式编码。幸运的是,它有一个
缓冲区
属性,可以让您直接输出
字节

sys.stdout.buffer.write(b'\xff\n')

只有在Python 2中,
print'\xff'
将字节字符串直接写入终端,这样就可以得到打印的字节,而不是用一个没有缓冲区的奇特的东西替换
sys.stdout

在Python3中,
print('\xff')
使用默认编码将Unicode字符U+00FF编码到终端…在您的例子中是UTF-8

要在Python 3中直接将字节输出到终端,您不能使用
print
,但可以使用以下方法跳过编码并写入字节字符串:

python3 -c "import sys; sys.stdout.buffer.write(b'\xff')"

在Python2中,
print'\xff'
将字节字符串直接写入终端,这样就可以得到打印的字节

在Python3中,
print('\xff')
使用默认编码将Unicode字符U+00FF编码到终端…在您的例子中是UTF-8

要在Python 3中直接将字节输出到终端,您不能使用
print
,但可以使用以下方法跳过编码并写入字节字符串:

python3 -c "import sys; sys.stdout.buffer.write(b'\xff')"

请把代码贴在这里而不是贴在imageroot@kali:~#python3-c'打印(“\xff”)| xxd 00000000:c3bf 0a。。。root@kali:~#python-c'print(“\xff”)| xxd 00000000:ff0请回答这个问题!完成了,补充道。做得好。请在这里发布代码,而不是imageroot@kali:~#python3-c'打印(“\xff”)| xxd 00000000:c3bf 0a。。。root@kali:~#python-c'print(“\xff”)| xxd 00000000:ff0请回答这个问题!完成,添加了它。很好的响应,为我提供了AttributeError:“bytes”对象没有属性“encode”,它仍然为我提供与print完全相同的输出(“\xff”)root@kali:~#python3-c“打印(b'\xff'.解码('latin-1'))”| xxd 00000000:c3bf 0a…是的。我才意识到我做了什么。它仍然以utf-8打印。等一下sec@3xpl017. 修复了为我提供AttributeError的问题:“bytes”对象没有属性“encode”,该属性仍然为我提供与print(“\xff”)完全相同的输出root@kali:~#python3-c“打印(b'\xff'.解码('latin-1'))”| xxd 00000000:c3bf 0a…是的。我才意识到我做了什么。它仍然以utf-8打印。等一下sec@3xpl017. 固定的