Я читаю некоторые в основном HEX-входные данные в скрипт Python3.Однако система настроена на использование UTF-8
, и при передаче из сценария Bash в сценарий я получаю следующее UnicodeDecodeError
ошибка :
UnicodeDecodeError: ('utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte)
Я использую 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 - это кодировка символов переменной ширины, способная кодировать все действительные кодовые точки в Unicode с использованием от одного до четырех 8-битных байтов .Таким образом, за любым последующим байтом (первый символ UTF-8 в диапазоне 0xC2 - 0xF4
) следует 1-3 байтов продолжения в диапазоне0x80 - 0xBF
.
Однако я не всегда могу быть уверенным, откуда поступает мой входной поток, и это вполне могут быть необработанные данные, а не версии ASCII HEX, как указано выше.Поэтому мне нужно как-то разобраться с этим необработанным вводом.
Я рассмотрел несколько альтернатив, таких как:
для использования codecs.decode
для использования open("myfile.jpg", "rb", buffering=0)
с raw I / O
с использованием bytes.decode(encoding="utf-8", errors="ignore")
из байтов
или просто с помощью open (...)
Но я не знаю, если иликак они могли читать потоковый поток ввода, как я хочу.
Как сделать так, чтобы мой скрипт обрабатывал также поток необработанных байтов?
PS.Да, я прочитал множество схожих проблем SO, но ни одна из них не имеет адекватного отношения к этой ошибке ввода UTF-8.Лучшим является этот .
Это не дубликат.