我正在尝试将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-8
,utf-7
或utf-32
是否可以编码Odia语言。
但是在这里,编解码器直接进入cp1252.py
,这里应该没有任何关系/ (我不确定是否) \
所以我的问题是...
encoded text
在decoding
期间出错? cp1252.py
?ODIA language
时如何在python中创建新的编码?\问题1和2最重要,3是可选/
答案 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。