Python unicode转换,解码部分不识别编码部分

Python unicode conversion, decoded part does not recognise the encoded part

我正在尝试将 ODIA LANGUAGE 用于一个项目。当我对 Odia 字符串进行编码,然后尝试对其进行解码时,出现错误。

b = "କାହିଁକି ଏଇଠି ଅଛୁ "
x = b.encode()
print(x)
m = x.decode()
print(m)

那么,对应的输出为:

b'\xe0\xac\x95\xe0\xac\xbe\xe0\xac\xb9\xe0\xac\xbf\xe0\xac\x81\xe0\xac\x95\xe0\xac\xbf \xe0\xac\x8f\xe0\xac\x87\xe0\xac\xa0\xe0\xac\xbf \xe0\xac\x85\xe0\xac\x9b\xe0\xad\x81 '
Traceback (most recent call last):
  File "x:\Pythonxx36\Egod\expeppp.py", line 9, in <module>
    print(m)
  File "C:\ProgramData\Miniconda3\envs\pygpu\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-6: character maps to <undefined>

我没有提到任何 encoding,因为我不确定 utf-8utf-7utf-32 是否可以编码 Odia 语言。
但是在这里,编解码器直接转到cp1252.py,这里应该没有任何关系/(我不确定) \

所以我的问题是...

  1. 为什么同样的 encoded textdecoding 期间出错?
  2. 什么是 cp1252.py
  3. 如果 Python Encodings 的 none 支持 ODIA language,如何在 python 中创建新编码?
    资源:Odia unicode block

\问题1和2最重要,3是可选的/

您的错误不是在解码过程中。这是当您尝试打印时。 m 是一个 Unicode 字符串,从 x 成功解码。但是在打印时,Python 会尝试将字符串再次编码为终端所需的编码。该编码是 cp1252,一种 Windows one-byte 编码。该编码无法处理 Odia,因此失败。

对于问题 3,您无法轻易创建新的编码。您需要将您的终端设置为使用可以处理 Odia 的编码,例如 UTF8。

cp1252 是您终端的默认编码。 Python 的旧版本自动将 Unicode 字符串编码为终端默认编码。您不需要显式 encode/decode,但您确实需要使用支持所用字符所需编码的 terminal/IDE。 UTF-8 是通常的选择,因为它可以处理所有 Unicode 字符。

在 Windows 上,Python 版本 3.6 和更高版本可以更好地处理 Unicode。终端编码被忽略,Windows Unicode 控制台 API 用于直接写入终端 window。您需要支持该语言的终端字体才能查看字符,或者使用支持 UTF-8 的 IDE:

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> b = "କାହିଁକି ଏଇଠି ଅଛୁ "
>>> print(b)
କାହିଁକି ଏଇଠି ଅଛୁ

要写入文件,默认编码是 locale.getpreferredencoding(False) 返回的值,对于您的系统来说将是 cp1252。而是指定编码。 UTF-8 适用于所有 Unicode 代码点。对于 Python 3,使用以下内容:

with open('out.txt','w',encoding='utf8') as f:
    f.write("କାହିଁକି ଏଇଠି ଅଛୁ ")

在Python2中使用io.open,兼容相同的语法。

在读取或写入文件时始终指定编码,这样代码就不必依赖可以在不同本地化 OS 版本之间更改的默认值。

许多 Windows 应用程序在读取文件时采用默认编码而不是 UTF-8,因此您可能希望使用 'utf-8-sig' 作为在文件开头写入签名的编码Windows 应用程序(例如:Excel)将识别并改用 UTF-8。