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-8
、utf-7
或 utf-32
是否可以编码 Odia 语言。
但是在这里,编解码器直接转到cp1252.py
,这里应该没有任何关系/(我不确定) \
所以我的问题是...
- 为什么同样的
encoded text
在 decoding
期间出错?
- 什么是
cp1252.py
?
- 如果 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。
我正在尝试将 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
? - 如果 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。