Преобразование Widechars в кодировку системы ANSI в Python - PullRequest
1 голос
/ 17 октября 2019

В настоящее время я пытаюсь улучшить работу программы чтения с экрана с Бекки! Интернет-почта . Проблема, с которой я сталкиваюсь, связана с представлением списка там. Этот элемент управления не поддерживает Unicode, но элементы отображаются на экране, поэтому, когда кто-то просматривает его, содержимое всех полей независимо от кодировки выглядит нормально. Однако при доступе через MSAA или UIA базовые символы и письма ANSI, закодированные с помощью кодовой страницы, заданной для программ, не поддерживающих Unicode, имеют правильный текст, тогда как письма, закодированные в Unicode, не имеют. Например, текст

Zażółć gęślą jaźń

представлен как:

ZaĹĽĂłĹ‚Ä ‡ gÄ ™ Ĺ ›lÄ… jaźń

Кажется, чтодолжна быть возможность перекодировать его из широких символов в системное кодирование с использованием WideCharToMultiByte, но перед попыткой этого я хотел бы спросить, возможно ли это в чистом Python?

Решение должно работать как в Python 2, так и в 3. .

В настоящий момент я просто заменяю известные комбинации этих символов их соответствующими представлениями, но это не очень хорошее решение, поскольку списки, содержащие замены и заменяемые символы, необходимо обновлять с каждым новым обнаруженным символом.

1 Ответ

1 голос
/ 17 октября 2019

ваш utf-8 декодируется как cp1250.

Я сделал в python3 следующее:

orig = "Zażółć gęślą jaźń"
wrong = "Zażółć gęślą jaźń"

for enc in range(437, 1300):
    try:
        res = orig.encode().decode(f"cp{enc}")
        if res == wrong:
            print('FOUND', res, enc)
    except:
        pass

... и в результате получилась кодовая страница 1250.

Итак, ваше решение должно быть:

import sys

def restore(garbaged):
    # python 3
    if sys.version_info.major > 2:
        return garbaged.encode('cp1250').decode()
    # python 2
    else:
        # is it a string
        try:
            return garbaged.decode('utf-8').encode('cp1250')
        # or is it unicode
        except UnicodeEncodeError:
            return garbaged.encode('cp1250')
...