Режим оболочки python3 может выводить символ utf-8 для некоторых байтов и не может для других, в чем причина? - PullRequest
0 голосов
/ 10 марта 2019

что я уже знал:

b'\xce\xb8'.decode('UTF-8') дает 'θ', потому что функция decode () предназначена для выполнения этой работы - декодирования байтов.

Что я хочу знать, так это то, что в режиме оболочки python3 есть некоторая конфигурация по умолчанию для управления следующим поведением (Python3).

>>> sys.getdefaultencoding()
'utf-8'
>>> b'\xce\xb8'.decode()
'θ'
>>> b'\xce\xb8'
b'\xce\xb8'
>>> b'\x41'
b'A'
>>> print(b'\xce\xb6')
b'\xce\xb6'
>>> print(b'\xce\xb6'.decode('utf8'))
ζ

похоже, что в режиме оболочки используется кодировка ASCII по умолчанию, а не utf8.

вопрос в том, правда ли это? если да, в каком пути находится конфиг?

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Это не имеет ничего общего с кодировкой.Python просто показывает вам в оболочке значение, которое вы только что дали, в более буквальном смысле.Попробуйте вместо этого:

a = b'\xce\xb8'
print(a)

результат:

θ

Таким образом, «a» действительно кодируется как UTF-8, как вы и ожидали.Вы просто неправильно истолковываете то, что Python выводит обратно на консоль.

Кстати, вы также, я думаю, не делаете то, что, как вы думаете, вы используете с префиксом 'b'.Похоже, вы используете Python 2.X.В этой версии Python префикс 'b' игнорируется.Я знаю это, потому что это не проявляется в отраженном результате.Смотрите здесь:

Python 2.x:

>>> b'\xce\xb8'
'\xce\xb8'

Python 3.X

>>> b'\xce\xb8'
b'\xce\xb8'

Так что в Python 2.X вы получите тот же результатс и без «б».В Python 3.X вы получаете в любом случае другое поведение, чем в Python 2.X.Я мало что сделал с Python 3.X, но я считаю, что это потому, что представление строк изменилось в 3.X.

PS: Если вам действительно все равно, как Python возвращает вам строки, я не знаю, есть ли способ изменить это.Интересно, однако, почему это важно для вас.

1 голос
/ 11 марта 2019

Python 3 представляет байты как эквивалентный символ ASCII, если значение байта находится в пределах диапазона ASCII, в противном случае он отображает экранированное шестнадцатеричное значение.

Из документов для byte тип:

В байтовых литералах разрешены только символы ASCII (независимо от объявленной кодировки исходного кода).Любые двоичные значения свыше 127 должны быть введены в байтовые литералы с использованием соответствующей escape-последовательности.

Это намеренное проектное решение (из того же документа)

, чтобы подчеркнуть, чтов то время как многие двоичные форматы включают элементы на основе ASCII и могут эффективно использоваться с некоторыми текстовыми алгоритмами, это обычно не относится к произвольным двоичным данным

Интерпретатор не отображает символы для байтов внеДиапазон ASCII, потому что он не может знать, закодированы ли байты как UTF-8, какая-то другая кодировка, или даже если они вообще представляют текстовые данные.

Как указывает пользователь Стив в своем ответе, это поведение не связанодля кодирования.Это не настраивается;если вы хотите видеть символы, соответствующие кодированной строке UTF-8, декодируйте в str.

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