【问题标题】:Python unicode conversion, decoded part does not recognise the encoded partpython unicode转换,解码部分不识别编码部分
【发布时间】:2019-10-05 20:01:15
【问题描述】:

我正在尝试将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是可选的/

【问题讨论】:

    标签: python unicode character-encoding python-unicode


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。即使我尝试将编码的字符串保存到文本文件中,同样的错误也会再次出现。您知道为什么会发生这种情况吗?
    • 让我编辑问题中的完整代码。请看一下@Ned。
    【解决方案2】:

    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,它与相同的语法兼容。

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

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

    【讨论】:

    • 谢谢。问题出在我的 ide(MS 代码)上。我将其更改为pychram,它起作用了。对于 MS 代码,我更改了默认编码,它给了我所需的结果。
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2019-12-19
    • 2012-04-10
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多