Страница 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
				Спасибо большое.