|
Вопрос # 27/ вопрос открыт / |
|
Недавно я спрашивал о боблиотеке для распаковки разных типов архивов, но нормальной не нашел, поэтому пишу свою. Напомню, от ZipTV пришлось отказаться, поскольку она неправильно работает с именами файлов в Русской раскладке. Сейчас я пишу класс, для распаковки Zip, использую библиотеку MiniZip (www.torry.ru), но оказывается она тоже не понимает Русских имен файлов. Вообще все библиотеки, что я нашел, для работы с Zip не понимают таких имен (исключая использующие dll, но это мне не подходит).
Кроме того, я выяснил, что дело не в библиотеке, а в самом формате - имя файла записывается в файл архива в исковерканом виде, но ведь WinRar его понимает.
Помогите разобраться с этим, может кто сталкивался - как преобразовать имя файла обратно в читаемый вид?
 |
Вопрос задал: Матвеев Игорь Владимирович (статус: Студент)
Вопрос отправлен: 29 мая 2006, 13:35
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Dron
Всё не так сложно, Игорь!
Недолгие эксперименты показали, что это - кодировка DOS, а перекодировать её следует в WIN. Опознать текст удалось с помощью программы Штирлиц. Также мне удалось найти небольшой пример перекодировки строк. См. его в приложении. Надеюсь, что вам всё удастся. Удачи!
Приложение: Переключить в обычный режим- procedure TForm1.Button1Click(Sender: TObject);
- var
- code1, code2: TCode;
- s: string;
- c: char;
- i: integer;
- chars: array [char] of char;
- str: array [TCode] of string;
- begin
- case ComboBox1.ItemIndex of
- 1: code1 := koi;
- 2: code1 := iso;
- 3: code1 := dos;
- else code1 := win;
- end;
- case ComboBox2.ItemIndex of
- 1: code2 := koi;
- 2: code2 := iso;
- 3: code2 := dos;
- else code2 := win;
- end;
- s := Memo1.Text;
-
-
-
-
-
-
- for c := #0 to #255 do
- Chars[c] := c;
-
- for i := 1 to Length(Str[win]) do
- Chars[Str[code2][i]] := Str[code1][i];
-
- for i := 1 to Length(s) do
- s[i] := Chars[s[i]];
-
- Memo2.Text := s;
- end;
 |
Ответ отправил: Dron (статус: Студент)
Время отправки: 29 мая 2006, 14:00
Оценка за ответ: 4
Комментарий к оценке: Да, это действительно Dos кодировка, непонятно только почему в описаниях Zip формата не написанно, что здесь принята именно Dos кодировка для имен файлов.
|
Ответ #2. Отвечает эксперт: Помфюк Владимир Степанович
Какая-то логика в том, что программы изначально писаны по ДОС сохранают обратную совместимость и, соответственно, кодировку, есть. Пример от Dron'а Вам понадобится если попадутся архивы со специфическими буквами, например украинские і,ї,є. Если имена только русские Вам достаточно воспользоватся функцией OEMToANSI
 |
Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 29 мая 2006, 16:29
Оценка за ответ: 4
Комментарий к оценке: Да, это действительно Dos кодировка, непонятно только почему в описаниях Zip формата не написанно, что здесь принята именно Dos кодировка для имен файлов.
В общем, проблема решена.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|