Я немного борюсь с этой проблемой, но работа с кодировкой настолько болезненна, что я должен прийти к вашим умным умом для некоторой помощи.Восстановление имен файлов с плохой кодировкой
В поездке, которую я совершил в Украину, друг, скопированный в мое перо, привел мне некоторые украинские именованные файлы. Однако, как и следовало ожидать, в процессе копирования на компьютере имена файлов стало невозможно читать мусор, например, это:
Ôàíòîì
Ну, у меня есть веские основания полагать, что исходные имена файлов были кодирование с использованием CP1251 (Я знаю это, потому что я вручную проверил таблицы кодирования и сумел правильно перевести имя группы). По-видимому, произошло то, что в процессе копирования коды CP1251, где они поддерживаются, и ОС теперь просто интерпретируют их как коды Unicode.
Я пытался «интерпретировать» коды в Python с помощью следующего сценария:
print u"Ôàíòîì".decode('cp1251')
Он не чувствует себя хорошо, хотя. В результате полная чушь, а также:
Ôà Гòîì
Если я сделать:
print repr(u"Ôàíòîì".decode('cp1251'))
я получаю:
u'\u0413\u201d\u0413\xa0\u0413\xad\u0413\u0406\u0413\xae\u0413\xac'
я узнал, что если бы я мог получить все элементы кода в Unicode и просто компенсировать их 0x350 Я бы разместил их в правильном месте для украинской кириллицы. Но я не знаю, как это сделать, и, вероятно, есть ответ, который более концептуально правильный, чем этот.
Любая помощь была бы принята с благодарностью!
Edit: Вот пример правильного перевода
Ôàíòîì следует перевести на Фантом.
Ô 0x00D4 -> Ф 0x0424
à 0x00E0 -> а 0x0430
í 0x00ED -> н 0x043D
ò 0x00F2 -> т 0x0442
î 0x00EE -> о 0x043E
ì 0x00EC -> м 0x043C
Как я уже говорил ранее, между правильными и неправильными кодовыми точками существует смещение 0x0350.
(ОК, файлы будут музыкальные файлы ... Я думаю, вы подозревали, что ...)
Некоторые другие тестовые строки (перевод которого я не знаю): Aac êîíò> Т.е фл Äâîº Êàï_òîøêà Ïîäèâèñü
Возможный дубликат http://stackoverflow.com/questions/7555335/how-to-convert-a-string-from-cp1251-to-utf8 – saulspatz
Это не CP1251; он выглядит как многобайтовый [Mojibake] (https://en.wikipedia.org/wiki/Mojibake); у вас был UTF-8 или аналогичный, и он был декодирован неправильно. Вы можете увидеть, может ли библиотека '' ftfy' (http://ftfy.readthedocs.org/en/latest/) сделать что-нибудь из этого. Это невозможно для образца, который вы дали. –
Можете ли вы поделиться с нами ожидаемым значением? Затем мы можем попытаться вернуться назад, чтобы увидеть, как Mojibake был создан и изменить процесс. И учтите, что байты могут быть * отброшены *, поскольку они не отображаются на печатные символы. Дайте нам вывод 'print repr (value)' output, а не вывод 'print value ', чтобы мы здесь делали что-либо значимое. –