Почему в zip в linux кракозяблы?



Предыдущая | Следующая

По спецификации, имена файлов в zip обязаны быть в одной из двух кодировок: cp437 (русского языка в ней нет) или utf-8. Если системная кодировка другая, имена обязаны перекодироваться при создании архива и при распаковке. Кодировка в файле указывается одним битом: если он установлен, то это utf-8, если снят, то cp437. К сожалению, некоторые проблемные программы пишут имена в текущей системной кодировке, но указывают в файле, что они в cp437. В результате правильно работающие программы прочитают их как cp437 и получат мусор. Проблема тут не в том, что архив создавался в винде, а в том, что он создавался программой, нарушающей спецификацию. Она должна была перекодировать имена в utf-8 и установить соответствующий флаг.

В ntfs все имена файлов хранятся в utf-16 и могут содержать символы, отсутствующие в системной кодировке. При чтении устаревшими функциями, они перекодируются в системную кодировку, с потерями. При чтении рекомендованными - остаются в utf-16, и программа должна уметь с ними работать.