Python 3.8 проблема с кодировкой - PullRequest
0 голосов
/ 04 мая 2020

Недавно, используя Python 3.8, я столкнулся с проблемой кодировки. Я упростил проблему до нескольких строк кода. Может быть, кто-то из сообщества Python мог бы пролить свет на поведение, которое я вижу:

import os, sys
c = chr(146)            # character hex 92 dec 146, end quote mark in cp1252
a = "Don" + c + "t"     # Don't with end quote instead of apostrophe
ae = a.encode('cp1252', errors='replace')
print(ae)
print(a)
sys.stdout.reconfigure(encoding='cp1252')
print(a)

OUTPUT:

b'Don?t'
Dont
Traceback (most recent call last):
  File "c:/1data/DEV/MyPy/Test/test_e1.py", line 8, in <module>
    print(a)
  File "C:\Python\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x92' in position 3: character maps to <undefined>

Итак, поскольку \ x92 является допустимым символом в " cp1252 ", почему \ x92 заменяется на '?' в первой строке вывода. Если бы я не использовал ошибки = «заменить», это вызвало бы исключение. Почему печать на стандартную печать с помощью «cp1252» вызывает исключение, а печать на стандартную печать с использованием «utf-8» - нет?

1 Ответ

2 голосов
/ 04 мая 2020

С https://en.wikipedia.org/wiki/Unicode: Шестьдесят пять кодовых точек (U + 0000 – U + 001F и U + 007F – U + 009F) зарезервированы в качестве кодов управления и соответствуют C0 и управляющие коды C1, определенные в ISO / IEC 6429. U + 0009 (табуляция), U + 000A (перевод строки) и U + 000D (возврат каретки) широко используются в текстах в кодировке Unicode. На практике кодовые точки С1 часто являются неправильно переведенными (Mojibake) унаследованными Windows -1252 символами, используемыми некоторыми английскими sh и западноевропейскими текстами с технологиями Windows. Так chr (146) в Unicode делает not представляет символ .

Чтобы получить символ в строке Python3 (Unicode), вы можете:

  • преобразовать из bytes введите: b'Don\x92t'.decode('cp1252')
  • найдите правильный код Unicode для , который равен 8217 de c или 2019 hex: 'Don\u2019t'
  • , просто введите символ: 'Don’t' - Python3 принимает символы Юникода в исходных файлах
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...