UTF-8
,当从Bash shell导入到脚本中时,我不断收到以下UnicodeDecodeError
error:
UnicodeDecodeError: ('utf-8'编解码器无法在位置0解码字节0xed:无效的连续字节)
我正在使用sys.stdin.read()
在Python3中读取管道输入,根据其他SO答案,像这样:
import sys
...
isPipe = 0
if not sys.stdin.isatty() :
isPipe = 1
try:
inpipe = sys.stdin.read().strip()
except UnicodeDecodeError as e:
err_unicode(e)
...
使用这种方式进行管道传输时它是有效的:
# echo "\xed\xff\xff\x0b\x04\x00\xa0\xe1" | some.py
<output all ok!>
然而,使用原始格式不会:
# echo -en "\xed\xff\xff\x0b\x04\x00\xa0\xe1"
▒▒▒
▒▒
# echo -en "\xed\xff\xff\x0b\x04\x00\xa0\xe1" | some.py
UnicodeDecodeError: ('utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte)
并且尝试了其他有前途的SO答案:
# echo -en "\xed\xff\xff\x0b\x04\x00\xa0\xe1" | python3 -c "open(1,'w').write(open(0).read())"
# echo -en "\xed\xff\xff\x0b\x04\x00\xa0\xe1" | python3 -c "from io import open; open(1,'w').write(open(0).read())"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python3.6/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte
据我所了解,当您的终端遇到UTF-8序列时,它期望其后跟随1至3个其他字节,就像这样:
UTF-8是一种可变宽度字符编码,能够使用一个到四个8位字节对Unicode中的所有有效代码点进行编码。 因此,在前导字节(范围在
0xC2 - 0xF4
的第一个UTF-8字符)之后的任何内容都应该跟随1-3个连续字节, 在0x80 - 0xBF
范围内。
然而,我不能总是确定我的输入流来自哪里,它很可能是原始数据,而不是像上面那样ASCII HEX字符串。因此,我需要以某种方式处理这些原始输入。
我看过了几种替代方案,比如:
使用codecs.decode进行编码
使用
open("myfile.jpg", "rb", buffering=0)
和原始I/O一起使用从bytes使用
bytes.decode(encoding="utf-8", errors="ignore")
或者只是使用open(...)
但我不知道它们是否能够读取像我想要的管道输入流。
如何让我的脚本也处理原始字节流?
PS. 是的,我已经阅读了很多类似的SO问题,但是没有一个能够充分解决这个UTF-8输入错误。最好的一个是this one。
这不是一个重复问题。
buffer
问题”。 - Davis Herring