Python unicode转换,已解码部分无法识别已编码部分

时间:2019-05-19 01:53:43

标签: python unicode character-encoding python-unicode

我正在尝试将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都不支持ODIA language时如何在python中创建新的编码?
    资源:Odia unicode block

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

在Windows上,Python 3.6和更高版本可以更好地处理Unicode。终端编码被忽略,并且Windows Unicode控制台API用于直接写入终端窗口。您需要一种支持该语言的终端字体来查看字符,或者使用支持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("କାହିଁକି ଏଇଠି ଅଛୁ ")

在Python 2中使用io.open,该语法与相同的语法兼容。

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

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