Страница 1 из 1

Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 20.08.2019 14:40:16
prot56k
Добрый день.
Пишу код в lazarus c использованием paszlib для создания zip архивов, все бы ничего,
но каталоги из интернациональных символов отображаются кракозябрами.

Есть код из официальной документации paszlib:
Код: Выделить всё
var
  OurZipper :TZipper;
  flist     :TStringList;
  ADiskFileName,
  AArchiveFileName :String;
  MyDirectory:String;
begin
       MyDirectory:='C:\MyFolder';
      flist:=TStringList.Create;
      FindAllFiles(flist, MyDirectory);   

       for I := 0 to flist.Count-1 do
        begin
             ADiskFileName:=flist.Strings[i];
             AArchiveFileName:=SysToUTF8(ADiskFileName);
             AArchiveFileName:=UTF8ToCP866(AArchiveFileName);
             OurZipper.Entries.AddFileEntry(ADiskFileName,AArchiveFileName);
        end;
        OurZipper.ZipAllFiles;
end;


при его запуске нормально отображаются только каталоги из киррилицы, а любые другие - из китайских, греческих символов и т.д. - опять кракозябры.
Подскажите пожалуйста, что надо добавить, что бы все каталоги нормально отображались.

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 08:48:06
Снег Север
Предполагаю, что это приисходит из-за функции UTF8ToCP866, которая очевидным образом преобразует из UTF8 только в кириллицу CP866

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 09:01:23
prot56k
Да, это и понятно, а как корректно преобразовывать не только к кириллице, а в любые другие национальные кодировки?

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 12:01:43
Снег Север
А оно правда надо? Лазарь работает в UTF8, юниксы тоже, винда использует widestring, которая перекодируется в UTF8. Древние национальные кодировки нафиг не нужны.
В винде функция GetShortName преобразовывает длинный путь к файлу в короткий (в формате 8.3).

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 12:39:05
prot56k
Может я что то не понимаю. К примеру у пользователя на компе установлен немецкий язык, соответственно есть несколько каталогов на немецком языке, именно с национальными символами не свойственных английскому языку к примеру: Mädchen , если его сжать, то получиться херня вместо буквы ä, вопрос как сделать , что бы было нормуль, и вообще почему LAZARUS такие символы коверкает, вы правильно сказали, что кругом везде UTF8 и проблем быть не должно, но они почему то есть, тот же Total Commander 9.0 написан на LASARUS и при архивации нет никаких проблем ни с китайским, ни с греческим ни каким либо другим языком - каталоги с национальными символами отображаются без проблем. Почему такая фигня? ведь UTF8 для того и нужна, что бы не было проблем с кодировкой, а она при архивации с помощью встроенного класса TZipper есть.

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 13:02:28
olegy123
prot56k писал(а):и вообще почему LAZARUS такие символы коверкает

Utf-ХХ как раз разрешают кодирование по национальным алфавитам. А вот кто выводит и как рисует на дисплее - это другой вопрос. Шрифт тоже должен ä|ö|ü знать как их рисовать. Бывает так что не знает.
Например Windows если нет нужного шрифта пытается отыскать похожий. А бывает находит абракадабру. Особенно про это знают в типографии. Corel Draw| PhotoShop и другие могут выводит фигню. Ютуб может писать квадратиками вместо иероглифов.

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 13:12:22
prot56k
Да я понимаю, но эксперимент проводится на одном и том же компьютере в одно и тоже время, берем Total Commader 9.0 (написан на том же LAZARUS) - сжимаем папку c немецкими, китайскими, греческими, русскими названиями каталогов - на выходе все ОК, пробую код из документации по paszlib - на выходе нормально только папки на английском языке, для русских надо делать UTF8ToCP866 для остальных кракозябры... вообщем прошу помощи, сам уже бессилен....

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 13:18:07
olegy123
Вообще то работа с текстом разрешается на уровне операционной системы. Если система в Windows-1251 (до XP включительно) то по умолчанию любой текст кодировался в Windows-1251(хотя возможно внутри он мог кодироваться в Unicode). Чтобы чтобы прочитат Koi8/Dos текст нужно было принудительно его перекодировать.
Windows7 уже идет UTF, но со старыми текстами нужно также принудительно указывать в каком формате.

Добавлено спустя 9 минут 2 секунды:
судя по описанию https://wiki.freepascal.org/paszlib

Код: Выделить всё
            ADiskFileName:=flist.Strings[i];
             AArchiveFileName:=StringReplace(flist.Strings[i],DirectoryPath,'',[rfReplaceall]);
             AArchiveFileName:=SysToUTF8(AArchiveFileName);
             AArchiveFileName:=UTF8ToCP866(AArchiveFileName);
             OurZipper.Entries.AddFileEntry(ADiskFileName,AArchiveFileName);

SysToUTF8 -> UTF8ToCP866 - это принудиловка, сначала из системы в UTF8 потом из UTF8 в Dos-CP866
этим примерам возможно лет 20, они не знали тогда об Win7, сотовые телефоны были кнопочными и музыка на них была на рингтонах.

попробуйте без алхимии SysToUTF8 -> UTF8ToCP866

Добавлено спустя 4 минуты 29 секунд:
fpunzipper.lpr * Fix bug ID 27158, allow use of UTF8 filenames. 3 years ago

https://github.com/graemeg/freepascal/t ... b/examples

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 21.08.2019 17:47:48
скалогрыз
1) проблема (БЫЛА) в ZIP файлах. Изначально в zip-архивах не было возможности указывать кодировки имени файла. (по-умолчанию выбиралась кодировка системы, на которой файл создавался)
2) проблему окончательно решили в версии zip формата 6.3.0 (в 2006 году) когда добавили флажок, который указывает на то, что имя файла будет закодировано в UTF8.
глядя в исходники Zipper-а для FPC3.0.4, стоит пометка:
Код: Выделить всё
     {$warning TODO implement EFS/language enooding using UTF-8}

https://github.com/graemeg/freepascal/b ... per.pp#L74
а значит не реализовано?!

я как раз такую поддержку недавно делал на C#.
Кому-нить интересно будет TZipper пропатчить?!

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 23.08.2019 03:40:21
Sharfik
скалогрыз писал(а):Кому-нить интересно будет TZipper пропатчить?!

Конечно нет. Мне кажется его вообще похоронили.
Мне он очень нужен был, и когда я стал разбираться почему при распаковке через 7-Zip у меня бред вылазит, то пришел к вопросу кодировок. Проблему я себе решил, и добавил как раз эти две строки в Wiki:
olegy123 писал(а):  AArchiveFileName:=SysToUTF8(AArchiveFileName);
             AArchiveFileName:=UTF8ToCP866(AArchiveFileName);

ИБО, всем англоговорящим, кто пишет на fpc до русских дела нет.

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 05.11.2019 14:43:58
prot56k
Коллеги, тогда вместо TZipper подскажите пожалуйста аналог компонентов VCLZIP (или каких нить других продвинутых) только для Lazarus

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 05.11.2019 15:16:45
serbod
скалогрыз писал(а):Кому-нить интересно будет TZipper пропатчить?!


Я не так давно делал эмуляцию TZipper/TUnzipper для старых и новых дельфей:
https://github.com/serbod/zexmlss/blob/ ... Zipper.pas

Найти и исправить ошибку для меня не проблема. Но обычно я во время поиска ошибки навожу порядок в коде, при этом получается много "незначительных" правок. У меня уже был конфликт с членами команды FPC на тему правок в CHM и LHelp. Не хочется снова влезать в эти интриги.

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 06.11.2019 11:49:39
Снег Север
prot56k писал(а):подскажите пожалуйста аналог компонентов VCLZIP

В Abbrevia 5.0 есть пакет для лазаря.
http://tpabbrevia.sourceforge.net
Не проверял, но под Делфи пользовался успешно.

Re: Кракозябры в национальных символах в классе Zipper

СообщениеДобавлено: 10.11.2019 12:49:34
prot56k
Спасибо большое.