Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Python: 'charmap' codec can't decode byte 0x98

#python #windows #python_3x #console #unicode


Добрый день
Считываю utf8-файл и вывожу в консоль. При попытке вывести букву "И" возникает ошибка:

File "I:\ProgramFile\Anaconda\lib\encodings\cp1251.py", line 15, in decode  
    return codecs.charmap_decode(input,errors,decoding_table)  
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1: character
maps to < undefined >


Воспроизводится на вот таком примере:

test_text_1 = "Задача\n"
test_text_2 = "Итератор"

file = open('temp.txt', 'w', encoding='utf-8')
file.write(test_text_1)
file.write(test_text_2)
file.close()

text = open('temp.txt', 'rb')

for byte_code in text:
    print(byte_code.strip())
    test_text = byte_code.decode('cp1251')
    print(test_text.strip())


Первое слово выводится нормально, а на втором - ошибка. Никак не могу найти способ
побороть проблему.

UPD: Видимо я описал проблему слишком широко, исправляюсь:

Как конвертировать "И" из utf-8 в cp1251? Для "А" всё работает, а для "И" - нет.

Код:

byte1 = 'А'.encode('utf-8')
byte2 = 'И'.encode('utf-8')
print(byte1, byte2)
test1 = byte1.decode('cp1251')
print(test1)
test2 = byte2.decode('cp1251')
print(test2)

    


Ответы

Ответ 1



Чтобы напечатать файл, содержащий текст в utf-8 кодировке, в консоль (аналог type filename в cmd.exe) в Питоне: #!/usr/bin/env python3 import shutil import sys with open(filename, encoding='utf-8') as file: shutil.copyfileobj(file, sys.stdout) Если хочется напечатать Юникодные символы, которые непредставимы в chcp кодировке (OEM code page), то см. Как из Python вывести на Windows-консоль строку в Юникоде?

Ответ 2



Если у вас файл записан в кодировке utf-8, то и декодировать нужно из кодировки utf-8: ... for byte in text: print(byte.strip()) text = byte.decode('utf-8') print(text.strip()) Результат: b'\xd0\x97\xd0\xb0\xd0\xb4\xd0\xb0\xd1\x87\xd0\xb0' Задача b'\xd0\x98\xd1\x82\xd0\xb5\xd1\x80\xd0\xb0\xd1\x82\xd0\xbe\xd1\x80' Итератор Когда вы записываете текст в файл в какой-то кодировке, вы фактически превращаете внутреннее представление текста в байты в указанной кодировке. Чтобы правильно декодировать эти байты обратно во внутреннее представление, при декодировании нужно указать ту же кодировку, что и при записи.

Комментариев нет:

Отправить комментарий