Проблема кодирования с использованием XZIP - PullRequest
0 голосов
/ 13 апреля 2011

Я написал программу на С ++, которая должна заархивировать файлы в своей работе.Для создания этих zip-файлов я использовал библиотеку XZip.При разработке эта программа работала на машине с Win7 и работает нормально.
Теперь программу следует использовать на машине с WindowsXP.Проблема, с которой я сталкиваюсь: если я позволю XZip создать zip-архив «ü.zip» и добавить файл «ü.txt» к нему на Win7, он будет работать как положено.Однако в WindowsXP я получаю файл «ü.zip» с «³.txt» в качестве файла.

«³» => «ü», конечно, проблема кодирования между UTF8 и Ascii (ü = 252 в UTF8 и 252 = ³ в Ascii), НО я не могу себе представить, как это может повлиятьсоздание внутренней структуры zip по-разному в зависимости от ОС.

// РЕДАКТИРОВАТЬ, чтобы очистить его:
проблема в том, что я запускаю тест с XZip на Win7 и получаю архив "ü.zip ", содержащий файл с именем" ü.txt ".
Когда я запускаю этот тест на компьютере с XP, я получаю архив" ü.zip ", содержащий файл" ³.txt ".

// Edit2: меня удивляет то, что именно заставляет zip меняться между XP и Win7.Тот факт, что он изменяется, означает, что либо функция Windows ведет себя по-разному, либо XZip имеет специфическое поведение для различных встроенных ОС.
При быстром взгляде на XZip я не вижу, что он меняет флаг кодировки в zip-архивах.,На вопрос, конечно, могут ответить только те люди, которые раньше тщательно изучили эту проблему.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Может быть, вы строите свою программу Win32 (или библиотеку) как ASCII (не как UNICODE). Это может помочь, если вы создаете свои приложения Win32 с настройкой конфигурации UNICODE (вы можете изменить ее в настройках проекта Visual Studio).

Невозможно сказать, что произошло в вашей программе, не увидев ваш код. Возможно, ваша библиотека или формат архива не поддерживает UNICODE, может быть, код вашей программы не поддерживает UNICODE, может быть, вы не обрабатываете строки достаточно осторожно, или вам просто нужно изменить настройку проекта на UNICODE. Кроме того, если вы не используете строки в кодировке UNICODE, имеет значение параметр «8-битная кодировка для программ, не поддерживающих Юникод», для ОС Windows.

Что касается 252, UTF8 и ASCII прочитали сообщение Джеймса Канзе. Более или менее безопасно использовать имена файлов ASCII без символов «:», «?», «*», «/», «\». Использование не-ASCII символов может привести к проблемам с кодированием, если вы не используете программы и файловые системы на основе UNICODE.

0 голосов
/ 13 апреля 2011

Как правило, если вам нужна переносимость между локалями, ОС (включая разные версии) и тем, что у вас есть, вы должны ограничить свои имена файлов обычными 26 буквами, 10 цифрами и, возможно, '_' и «-» (и я даже не уверен в последнем) и один «.», не более трех символов от конца. Как только вы начнете использовать буквы, выходящие за пределы исходного набора символов ASCII, вы получите доступ к различным программам, которые интерпретируют набор символов.

Кроме того, 252 не является ничем в ASCII, так как ASCII использует только коды символов в диапазоне 0 ... 127. А в UTF-8 252 будет первым байтом шестибайтового символа. То, чего нет в Unicode: в UTF-8 LATIN SMALL LETTER U WITH DIAERESIS будет двухбайтовой последовательностью 0xC3, 0xBC. 256 - это кодировка LATIN SMALL LETTER U с диаэрезом в ISO 8859-1, иначе известная как Latin-1; это также кодировка в UTF-16 и UTF-32.

Ничто из этого, конечно, не должно влиять на то, что находится в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...