最近,使用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)
输出:
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替换为'?'在输出的第一行。 如果我不使用errors =“ replace”,它将引发异常。 为什么用“ cp1252”打印为标准输出却不能使用“ utf-8”打印为标准输出呢?
答案 0 :(得分:2)
来自https://en.wikipedia.org/wiki/Unicode: 65个代码点(U + 0000–U + 001F和U + 007F–U + 009F)被保留为控制代码,并且对应于C0和C1控制代码在ISO / IEC 6429中定义。U + 0009(Tab),U + 000A(换行)和U + 000D(回车)被广泛用于Unicode编码的文本中。实际上,C1代码点通常是不正确翻译的(Mojibake)Windows-1252遗留字符,某些使用Windows的Windows技术在英语和西欧文本中使用。因此,Unicode中的chr(146)不会不是代表’
字符。
要在Python3(Unicode)字符串中获取’
字符,您可以:
bytes
类型转换为:b'Don\x92t'.decode('cp1252')
’
找到正确的Unicode代码点,它是8217 dec或2019十六进制:'Don\u2019t'
'Don’t'
-Python3接受源文件中的unicode字符