Проблемы с кодированием, связанные с Python и иностранными языками - PullRequest
1 голос
/ 16 июня 2020

Вот проблема, с которой я столкнулся при кодировании и декодировании текстов.

Я пытаюсь написать код, который находит «строку» или «байт» в файле и возвращает путь к файлу .

В настоящее время, поскольку файлы, которые я открываю, имеют кодировку 'windows -1252' или 'cp-1252', я пытался: 1. закодировать мою строку в байт, соответствующий кодировка файла 2. сопоставьте файл и получите путь к нему

У меня есть файл, скажем 'f', который имеет кодировку 'windows -1252' или 'cp-1252' . Он включает текст на китайском языке: '[跑Online農場]'

with open(os.path.join(root, filename), mode='rb') as f:
    text = f.read()
    print(encoding(text)) # encoding() is a separate function that I wrote that returns the encoding of the file
    print(text)
Windows-1252
b'\x00StaticText\x00\x00\x12\x00[\xb6]Online\xb9A\xb3\xf5]\x00\x01\x00\x ...

Как видите, «двоичный» текст для [跑Online農場] - это [\xb6]Online\xb9A\xb3\xf5]

Однако самое забавное, что если я буквально конвертирую строку в байты, я получаю:

enter_text = '[跑Online農場]'
print(bytes(enter_text, 'cp1252'))
UnicodeEncodeError: 'charmap' codec can't encode character '\u8dd1' in position 1: character maps to <undefined>

С другой стороны, открывая файл с помощью

with open(os.path.join(root, filename), mode='r', encoding='cp-1252') as f ...

, я получаю:

StaticText   [¶]Online¹A³õ]   €?‹  Œ  î...

, который я не уверен, как бы «перевести» '[跑Online農場]' в '[¶]Online¹A³õ]'. Ответ на этот вопрос также может решить проблему.

Что мне делать, чтобы правильно «кодировать» китайские / иностранные символы, чтобы они соответствовали байтам «rb», возвращаемым Python?

Спасибо!

1 Ответ

1 голос
/ 16 июня 2020

Ваша функция encoding неверна: код c файла, вероятно, CP950, но, конечно, не CP1252.

Примечание: угадать кодировку данной байтовой строки всегда можно приблизительно. Нет безопасного способа точно определить кодировку.

Если у вас есть строка байтов, например

b'[\xb6]Online\xb9A\xb3\xf5]'

, и вы знаете, что она должна преобразовываться (декодироваться) в

'[跑Online農場]'

тогда вы можете методом проб и ошибок с несколькими кодеками.

Я сделал это со списком кодеков, поддерживаемых Python, ища кодеки для китайского языка.

При использовании CP-1252 (версия Windows Latin-1), как и вы, вы получаете моджибаке:

>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp1252')
'[¶]Online¹A³õ]'

При использовании CP-950 (кодовая страница Windows для Традиционный китайский), вы получите ожидаемый результат:

>>> b'[\xb6]Online\xb9A\xb3\xf5]'.decode('cp950')
'[跑Online農場]'

Итак: используйте CP-950 для чтения файла.

...