Как работать со строками, кодировка которых неясна

Я знаю, что в Интернете и на stackoverflow довольно много информации о Python и кодировании символов, но я не знаю действительно не нашел ответ, который я ищу. Так что, рискуя создать дубликат, я все равно спрошу.

Это скрипт, который получает словарь, где все ключи соответствуют юникоду. Значения представляют собой строки с неизвестной кодировкой. Для ключей это не имеет большого значения, все ключи очень просты, в отличие от значений. Значения могут содержать (и содержат) большое разнообразие кодировок. В некоторых словарях одни значения указаны в ASCII, другие в UTF-16BE, третьи в cp1250.

Это полностью мешает дальнейшей обработке, которая в настоящее время состоит в основном из печати или объединения (да, это просто).

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

for key in data.keys():
   # hope they did not chose a funky encoding
   try:
       print key+":"+data[key] # this triggers a UnicodeDecodeError on many encodings
       current_data = data[key]
   except UnicodeDecodeError:
   # trying to cope with a funky encoding             
        current_data = data[key].decode(chardet.detect(data[key])['encoding']) # doing this on each value, because the dictionary sometimes contains multiple encodings
        print key+":", # printing without newline was a workaround, because connecting didn't work
        print current_data.encode('UTF-8')

В Python это работает просто отлично. В Jython 2.7rc1, который я использую в проекте (без возможности переключения), он печатает символы, которые определенно не являются исходной кодировкой (причудливо выглядящие символы). Если у кого-нибудь есть идея, как я могу заставить это работать и на Jython, это было бы здорово!

Редактировать (пример): Sample-Value:

Our latest scenarios explore two possible versions of the future seen through fresh “lenses”. 

Создает строку, в которой правая и левая двойные кавычки превращаются в \x8D и \x8E. Я не знаю, что это за кодировка. В Python после использования приведенного выше кода он их удаляет. В Jython он превращает их в белые квадраты.


person user857990    schedule 26.06.2015    source источник
comment
Как мы можем воспроизвести вашу проблему? Попробуйте предоставить минимальный, полный и проверяемый пример.   -  person mzjn    schedule 06.07.2015
comment
Поскольку я поднял вопрос, я болен и до сих пор не имею доступа к этим данным. Извиняюсь.   -  person user857990    schedule 06.07.2015


Ответы (1)


Я не знаком с Jython, но следующая ссылка, которую я нашел, может оказаться полезной: http://python.6.x6.nabble.com/character-encoding-issues-td1766833.html

В нем говорится, что вы должны хранить все строки Unicode в отдельных файлах в вашем источнике и читать их с помощью codecs.open. Похоже, это сработало для человека, который столкнулся с проблемой, похожей на вашу.

В следующей ссылке также упоминается указание параметра кодирования для JVM: https://answers.launchpad.net/sikuli/+question/156443

Не видя каких-либо фактических выходных данных об ошибках, это степень помощи, которую я могу предоставить.

person Andrew Winterbotham    schedule 02.07.2015
comment
Файлы, которые я открываю, иногда имеют различные кодировки внутри. Я читаю информацию о документе в формате PDF. - person user857990; 06.07.2015
comment
Вы все еще не дали достаточно информации. Не зная, в чем именно проблема, можно только догадываться, в чем проблема и почему она возникает. Пробовали ли вы реализовать совет из приведенных выше ссылок? Вот две другие проблемы с jython.org, которые кажутся похожими на вашу и могут быть вам полезны: issue 1841 и выпуск 1592 - person Andrew Winterbotham; 06.07.2015
comment
Вы видели комментарий, который я оставил под основным постом? - person user857990; 06.07.2015
comment
Да, я сделал. Я не спрашивал, почему вы не предоставили достаточно информации; Я просто констатировал, что информации по-прежнему недостаточно, чтобы кто-то мог вам помочь. - person Andrew Winterbotham; 06.07.2015