Преобразование Unicode в Python, декодированная часть не распознает закодированную часть - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь использовать 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 langauge.
Но здесь кодеки переходят непосредственно к cp1252.py, который здесь не должен иметь никакого отношения / (я не уверен, если) \

Так что мои вопросы ...

  1. Почему тот же encoded text выдает ошибку во время decoding?
  2. Что такое cp1252.py?
  3. Как создать новую кодировку в python, если ни одна из Python Encodings не поддерживает ODIA language?
    Ресурс: Блок Odia Unicode

\ Вопросы 1 и 2 являются наиболее важными, 3 необязательно /

Ответы [ 2 ]

3 голосов
/ 19 мая 2019

Ваша ошибка не во время декодирования.Это когда ты пытаешься печатать.m - строка Unicode, успешно декодированная из x.Но при печати Python пытается снова закодировать строку в кодировку, необходимую вашему терминалу.Это кодирование cp1252, однобайтовая кодировка Windows.Эта кодировка не может обработать Odia, поэтому она терпит неудачу.

Для вопроса 3 вы не можете легко создать новую кодировку.Вам нужно настроить свой терминал на использование кодировки, которая может обрабатывать Odia, например UTF8.

1 голос
/ 20 мая 2019

cp1252 - кодировка по умолчанию для вашего терминала. Старые версии Python автоматически кодируют строки Unicode в кодировку терминала по умолчанию. Вам не нужно явно кодировать / декодировать, но вам нужно использовать терминал / IDE, который поддерживает кодировку, необходимую для используемых символов. UTF-8 является обычным выбором, поскольку он может обрабатывать все символы Unicode.

В Windows версии Python 3.6 и выше лучше обрабатывают Unicode. Кодировка терминала игнорируется, и API консоли Windows Unicode используются для прямой записи в окно терминала. Вам понадобится терминальный шрифт, который поддерживает язык, чтобы видеть символы, или использовать IDE, которая поддерживает UTF-8:

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("କାହିଁକି ଏଇଠି ଅଛୁ ")

Используйте io.open в Python 2, который совместим с тем же синтаксисом.

Всегда указывайте кодировку при чтении или записи файла, чтобы коду не приходилось полагаться на значение по умолчанию, которое может меняться в разных локализованных версиях ОС.

Многие приложения Windows используют кодировку по умолчанию при чтении файла вместо UTF-8, поэтому вы можете использовать 'utf-8-sig' в качестве кодировки для записи подписи в начале файла, который приложения Windows (например, Excel) вместо этого распознает и использует UTF-8.

...