Я знаю, что в Интернете и на 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 он превращает их в белые квадраты.