Python 3.8编码问题

时间:2020-05-04 17:35:37

标签: python encoding python-3.8

最近,使用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”打印为标准输出呢?

1 个答案:

答案 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字符