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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение prot56k » 20.08.2019 14:40:16

Добрый день.
Пишу код в 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;


при его запуске нормально отображаются только каталоги из киррилицы, а любые другие - из китайских, греческих символов и т.д. - опять кракозябры.
Подскажите пожалуйста, что надо добавить, что бы все каталоги нормально отображались.
prot56k
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.08.2019 14:22:23

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

Сообщение Снег Север » 21.08.2019 08:48:06

Предполагаю, что это приисходит из-за функции UTF8ToCP866, которая очевидным образом преобразует из UTF8 только в кириллицу CP866
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение prot56k » 21.08.2019 09:01:23

Да, это и понятно, а как корректно преобразовывать не только к кириллице, а в любые другие национальные кодировки?
prot56k
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.08.2019 14:22:23

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

Сообщение Снег Север » 21.08.2019 12:01:43

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

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

Сообщение prot56k » 21.08.2019 12:39:05

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

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

Сообщение olegy123 » 21.08.2019 13:02:28

prot56k писал(а):и вообще почему LAZARUS такие символы коверкает

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

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

Сообщение prot56k » 21.08.2019 13:12:22

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

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

Сообщение olegy123 » 21.08.2019 13:18:07

Вообще то работа с текстом разрешается на уровне операционной системы. Если система в 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
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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 пропатчить?!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение Sharfik » 23.08.2019 03:40:21

скалогрыз писал(а):Кому-нить интересно будет TZipper пропатчить?!

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

ИБО, всем англоговорящим, кто пишет на fpc до русских дела нет.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 759
Зарегистрирован: 20.07.2013 01:04:30

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

Сообщение prot56k » 05.11.2019 14:43:58

Коллеги, тогда вместо TZipper подскажите пожалуйста аналог компонентов VCLZIP (или каких нить других продвинутых) только для Lazarus
prot56k
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.08.2019 14:22:23

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

Сообщение serbod » 05.11.2019 15:16:45

скалогрыз писал(а):Кому-нить интересно будет TZipper пропатчить?!


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

Найти и исправить ошибку для меня не проблема. Но обычно я во время поиска ошибки навожу порядок в коде, при этом получается много "незначительных" правок. У меня уже был конфликт с членами команды FPC на тему правок в CHM и LHelp. Не хочется снова влезать в эти интриги.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

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

Сообщение Снег Север » 06.11.2019 11:49:39

prot56k писал(а):подскажите пожалуйста аналог компонентов VCLZIP

В Abbrevia 5.0 есть пакет для лазаря.
http://tpabbrevia.sourceforge.net
Не проверял, но под Делфи пользовался успешно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение prot56k » 10.11.2019 12:49:34

Спасибо большое.
prot56k
незнакомец
 
Сообщения: 8
Зарегистрирован: 20.08.2019 14:22:23


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

Рейтинг@Mail.ru