Python3以一种奇怪的方式处理非ASCII字符
我试图用Python3解决一个问题。为此,我需要打印一些不在ASCII范围内的字符 Python3正在将这些字符转换成某种奇怪的Unicode 例如,如果我在Python 3中打印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中,它的工作原理与预期一样,如下
“\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. 固定的