Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 27

/ вопрос открыт /

Недавно я спрашивал о боблиотеке для распаковки разных типов архивов, но нормальной не нашел, поэтому пишу свою. Напомню, от ZipTV пришлось отказаться, поскольку она неправильно работает с именами файлов в Русской раскладке. Сейчас я пишу класс, для распаковки Zip, использую библиотеку MiniZip (www.torry.ru), но оказывается она тоже не понимает Русских имен файлов. Вообще все библиотеки, что я нашел, для работы с Zip не понимают таких имен (исключая использующие dll, но это мне не подходит).
Кроме того, я выяснил, что дело не в библиотеке, а в самом формате - имя файла записывается в файл архива в исковерканом виде, но ведь WinRar его понимает.
Помогите разобраться с этим, может кто сталкивался - как преобразовать имя файла обратно в читаемый вид?

Приложение:
  1.  
  2.  
  3.  


Матвеев Игорь Владимирович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Матвеев Игорь Владимирович (статус: Студент)
Вопрос отправлен: 29 мая 2006, 13:35
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Dron

Всё не так сложно, Игорь!
Недолгие эксперименты показали, что это - кодировка DOS, а перекодировать её следует в WIN. Опознать текст удалось с помощью программы Штирлиц. Также мне удалось найти небольшой пример перекодировки строк. См. его в приложении. Надеюсь, что вам всё удастся. Удачи!

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. code1, code2: TCode;
  4. s: string;
  5. c: char;
  6. i: integer;
  7. chars: array [char] of char;
  8. str: array [TCode] of string;
  9. begin
  10. case ComboBox1.ItemIndex of
  11. 1: code1 := koi;
  12. 2: code1 := iso;
  13. 3: code1 := dos;
  14. else code1 := win;
  15. end;
  16. case ComboBox2.ItemIndex of
  17. 1: code2 := koi;
  18. 2: code2 := iso;
  19. 3: code2 := dos;
  20. else code2 := win;
  21. end;
  22. s := Memo1.Text;
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29. for c := #0 to #255 do
  30. Chars[c] := c;
  31.  
  32. for i := 1 to Length(Str[win]) do
  33. Chars[Str[code2][i]] := Str[code1][i];
  34.  
  35. for i := 1 to Length(s) do
  36. s[i] := Chars[s[i]];
  37.  
  38. Memo2.Text := s;
  39. end;


Ответ отправил: Dron (статус: Студент)
Время отправки: 29 мая 2006, 14:00
Оценка за ответ: 4

Комментарий к оценке: Да, это действительно Dos кодировка, непонятно только почему в описаниях Zip формата не написанно, что здесь принята именно Dos кодировка для имен файлов.

Ответ #2. Отвечает эксперт: Помфюк Владимир Степанович

Какая-то логика в том, что программы изначально писаны по ДОС сохранают обратную совместимость и, соответственно, кодировку, есть. Пример от Dron'а Вам понадобится если попадутся архивы со специфическими буквами, например украинские і,ї,є. Если имена только русские Вам достаточно воспользоватся функцией OEMToANSI

Приложение:
  1. WinStr:=OemToAnsi(DOSStr);


Ответ отправил: Помфюк Владимир Степанович (статус: Абитуриент)
Время отправки: 29 мая 2006, 16:29
Оценка за ответ: 4

Комментарий к оценке: Да, это действительно Dos кодировка, непонятно только почему в описаниях Zip формата не написанно, что здесь принята именно Dos кодировка для имен файлов.
В общем, проблема решена.

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:27
Выполнено за 0.02 сек.