Как преобразовать строку байта в символ с правильным экранированием? - PullRequest
0 голосов
/ 20 февраля 2019

Не могу понять, почему декодирование завершается неудачно, если строка байтов начинается с шестнадцатеричного a, b, c, d, e или f, а не с числа, вместо двух всегда есть две обратные косые черты.

>>> bstr = b'\xfb'
>>> bstr.decode('utf8', 'backslashreplace')
'\\xfb'

Вместо этого я хочу '\ xfb'.

, но

>>> bstr = b'\x1f'
>>> bstr.decode('utf8', 'backslashreplace')
'\x1f'

работает, как и ожидалось.Вы знаете, что не так?

1 Ответ

0 голосов
/ 20 февраля 2019

b'\xfb' - строка байтов, содержащая один байт.Этот байт имеет шестнадцатеричное значение FB или 251 в десятичном виде.

'\xfb' - строка, содержащая одну кодовую точку Unicode.Эта кодовая точка - U + 00FB LATIN SMALL LETTER U WITH CIRCUMFLEX, или û.

b'\xfb' - это , а не кодировка UTF-8 '\xfb'.Кодировка UTF-8 '\xfb' равна b'\xc3\xbb':

>>> '\xfb'.encode('utf-8')
b'\xc3\xbb'

Фактически, b'\xfb' вообще не является кодировкой UTF-8 вообще, и пытается декодировать ее как UTF-8.это ошибка.'backslashreplace' указывает способ обработки этой ошибки, когда байт FB заменяется последовательностью символов backslash-xfb.

Хотя можно сделать что-то, что преобразует b'\xfb' в '\xfb',это преобразование не имеет ничего общего с UTF-8, и применение этого преобразования без уточнения ваших требований только вызовет больше проблем.Вы должны выяснить, что на самом деле должна делать ваша программа.Скорее всего, правильный путь вперед не предполагает преобразования b'\xfb' в '\xfb'.Мы не можем сказать, что вам нужно сделать, так как нам не хватает такого контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...