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

2024-04-19 15:01:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将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 langauge。
但是在这里,编解码器直接转到cp1252.py,这里不应该有任何关系/(我不确定是否)\

所以我的问题是。。。你知道吗

  1. 为什么相同的encoded text会在decoding期间出错?你知道吗
  2. 什么是cp1252.py?你知道吗
  3. 如果Python Encodings都不支持ODIA language,如何在python中创建新的编码?
    资源:Odia unicode block

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


Tags: inpy编码utfencodefileprintx81
2条回答

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

在Windows上,python3.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("କାହିଁକି ଏଇଠି ଅଛୁ ")

在python2中使用io.open,这与相同的语法兼容。你知道吗

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

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

你的错误不是在解码过程中。当你试着打印的时候。m是一个Unicode字符串,从x成功解码。但在打印时,Python会尝试将字符串再次编码为终端所需的编码。这种编码是cp1252,一种Windows单字节编码。这种编码不能处理Odia,所以它失败了。你知道吗

对于问题3,您无法轻松创建新编码。您需要将终端设置为使用能够处理Odia的编码,如UTF8。你知道吗

相关问题 更多 >