Недавно, используя 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» - нет?