#51
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Alex Korchmar написал(а) к Eugene Grosbein в Apr 18 19:41:30 по местному времени:
From: Alex Korchmar <noreply@linux.e-moe.ru> Eugene Grosbein <Eugene.Grosbein@f1.n5006.z2.fidonet.org> wrote: AK>> что-то скопировать оттуда таром, и пытаюсь найти хоть один архиватор, AK>> работающий во freebsd не с единственно-правильной кодировкой. AK>> Пока, увы, ноль. EG> А не мог бы ты перестать страдать XY-фигнёй и честно рассказать, EG> чего ты хочешь в итоге получить и как именно ты это делаешь сейчас уже ничего не хочу - кроме как стереть бнопняные файлы с ненабираемыми на клавиатуре и непоказываемыми ни в какой кодировке именами (пока руки не дошли) А хотел сперва банально распаковать tar, созданный на чужой системе. Не знаю, как и какой. Судя по "schili extensions" - bsd tar, возможно, очень старый. Выяснилось, что это невозможно в принципе, уже в момент создания архива его содержимое безвозвратно испорчено рукожопой перекодировкой. Попутно - что нынешний bsd tar перекодирует все подряд, сообразно своему пониманию, что именно перекодируется, без возможности его явно отменить. ~/test> touch 1251/`echo 'афаййей' | iconv -t cp1251` ~/test> touch utf8/`echo 'афаййей' | iconv -t utf8 ` ~/test> tar -cvf test * a 1251 a 1251/ЮТЮИИЕИ a utf8 a utf8/(нетерминальные символы) a афаййей никаких предупреждений при этом не выдается. (предупреждения из subj выдадутся, если запускать tar с локалью utf8. Не смотря на эти предупреждения, такой архив как раз будет подлежать восстановлению. Архив, созданный в не-utf8 локали, испорчен необратимо.) > Alex --- ifmail v.2.15dev5.4 |
#52
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Eugene Grosbein написал(а) к Alex Korchmar в Apr 18 03:01:22 по местному времени:
02 апр. 2018, понедельник, в 17:41 NOVT, Alex Korchmar написал(а): AK>>> что-то скопировать оттуда таром, и пытаюсь найти хоть один архиватор, AK>>> работающий во freebsd не с единственно-правильной кодировкой. AK>>> Пока, увы, ноль. EG>> А не мог бы ты перестать страдать XY-фигнёй и честно рассказать, EG>> чего ты хочешь в итоге получить и как именно ты это делаешь AK> сейчас уже ничего не хочу - кроме как стереть бнопняные файлы с ненабираемыми AK> на клавиатуре и непоказываемыми ни в какой кодировке именами (пока руки не AK> дошли) AK> А хотел сперва банально распаковать tar, созданный на чужой системе. Не знаю, AK> как и какой. AK> Судя по "schili extensions" - bsd tar, возможно, очень старый. AK> Выяснилось, что это невозможно в принципе, уже в момент создания архива его AK> содержимое безвозвратно испорчено рукожопой перекодировкой. Ты же не знаешь, где и как создан tar, так почему ты считаешь, что он внутри испорчен - только потому, что лично ты ниасилил его развернуть? AK> Попутно - что нынешний bsd tar перекодирует все подряд, сообразно своему AK> пониманию, что именно перекодируется, Перекодирует в соответствии со документированной спецификацией формата, про что ты просто не удосужился почитать. На фряхе это собственно man tar, который ссылается на man libarchive-formats. По дефолту при создании tar используется restricted pax format: The pax interchange format converts filenames to Unicode and stores them using the UTF-8 encoding. Prior to libarchive 3.0, libarchive erroneously assumed that the system wide-character routines natively supported Unicode. This caused it to mis- handle non-ASCII filenames on systems that did not satisfy this assumption. AK> без возможности его явно отменить. Неправда. tar --format ustar -cf test.tar создаёт tar-файл с именами внутри "как есть". То же самое будет для tar --format gnutar, в соответствии со спецификациями обоих форматов. AK> ~/test> touch 1251/`echo 'афаййей' | iconv -t cp1251` AK> ~/test> touch utf8/`echo 'афаййей' | iconv -t utf8 ` AK> ~/test> tar -cvf test * AK> a 1251 AK> a 1251/ЮТЮИИЕИ AK> a utf8 AK> a utf8/(нетерминальные символы) AK> a афаййей Опять приходится догадываться, что локаль у тебя KOI8-R, четко сообщать условия тестирования ты почему-то не считаешь нужным. Как я уже несколько раз повторял, визуализация на терминале не повторяет байтов, сохранённых в самом архиве, хотя и может с ними совпасть в зависимости от разных факторов типа формата tar и текущей локали. Eugene --- slrn/1.0.2 (FreeBSD) |
#53
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Eugene Grosbein написал(а) к Alex Korchmar в Apr 18 03:18:48 по местному времени:
02 апр. 2018, понедельник, в 17:41 NOVT, Alex Korchmar написал(а): AK> Архив, созданный в не-utf8 локали, испорчен необратимо. Опять же неправда, так как в "чистой" локали koi8-r всё работает: $ set | egrep 'LANG|LC_' LANG=ru_RU.KOI8-R $ mkdir -p test/1251 test/utf8 $ cd test $ touch 1251/`echo 'афаййей' | iconv -f koi8-r -t cp1251` $ touch utf8/`echo 'афаййей' | iconv -f koi8-r -t utf8` $ touch 'афаййей' $ find . -type f ./афаййей ./utf8/п╟я└п╟п╧п╧п╣п╧ ./1251/ЮТЮИИЕИ $ tar -cvf test.tar * a 1251 a 1251/ЮТЮИИЕИ a utf8 a utf8/п\260я\204п\260п\271п\271п\265п\271 a афаййей $ mkdir ../test2 && cd ../test2 $ find . -type f ./афаййей ./1251/ЮТЮИИЕИ ./utf8/п╟я└п╟п╧п╧п╣п╧ Специально проверил: md5 от сортированного вывода find в исходном каталоге test и в test2 совпадают. Но у тебя, помнится, не чистая локаль - что-то в KOI8-R, что-то нет и тогда, возможно, какой-то баг и вылазит. Eugene --- slrn/1.0.2 (FreeBSD) |
#54
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Eugene Grosbein написал(а) к Eugene Grosbein в Apr 18 03:23:30 по местному времени:
02 апр. 2018, понедельник, в 16:17 NOVT, Eugene Grosbein написал(а): EG> И в "дереве фри" нет и не было утилиты для создания zip, Вот тут ошибся - tar на фре умеет создавать zip, так как он просто обёртка над libarchive. Собственно, в man tar есть пример: tar -a -cf archive.zip source.c source.h creates a new archive with zip format Eugene -- Поэты - страшные люди. У них все святое. --- slrn/1.0.2 (FreeBSD) |
#55
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Eugene Grosbein написал(а) к All в Apr 18 03:51:15 по местному времени:
03 апр. 2018, вторник, в 02:18 NOVT, Eugene Grosbein написал(а): AK>> Архив, созданный в не-utf8 локали, испорчен необратимо. EG> Опять же неправда, так как в "чистой" локали koi8-r всё работает: EG> $ set | egrep 'LANG|LC_' EG> LANG=ru_RU.KOI8-R А вот что происходит, если выставить твою "локаль", которую ты в этом треде показывал: $ set | egrep 'LANG|LC_' LANG= LC_ALL= LCCOLLATE=ruRU.UTF-8 LCCTYPE=ruRU.UTF-8 LC_MESSAGES=C LC_MONETARY=C LC_NUMERIC=C LC_TIME=C $ find . -type f | sort ./1251/ЮТЮИИЕИ ./utf8/п╟я└п╟п╧п╧п╣п╧ ./афаййей $ tar -cvf test.tar * a 1251 a 1251/\340\364\340\351\351\345\351tar: 1251/ЮТЮИИЕИ: Can't translate pathname '1251/ЮТЮИИЕИ' to UTF-8 a utf8 a utf8/\320\260\321\204\320\260\320\271\320\271\320\265\320\271tar: utf8/п╟я└п╟п╧п╧п╣п╧: Can't translate pathname 'utf8/п╟я└п╟п╧п╧п╣п╧' to UTF-8 a \301\306\301\312\312\305\312tar: афаййей: Can't translate pathname 'афаййей' to UTF-8 Не сумев преобразовать сырой UTF-8 из (видимо) ASCII в UTF-8, оно кладёт внутрь tar-файла сырой UTF-8 как есть: $ dd if=test.tar bs=1 skip=3096 count=25 2>/dev/null | iconv -f utf-8 -t koi8-r path=utf8/афаййей И такой tar в "чистой" локали, к примеру, KOI8-R разворачивается прекрасно, без каких-либо искажений. И даже если его разворачивать в указанной выше "локали": $ tar -xvf ../test/test.tar x 1251/ x 1251/\340\364\340\351\351\345\351 x utf8/ x utf8/\320\260\321\204\320\260\320\271\320\271\320\265\320\271 x \301\306\301\312\312\305\312 И это опять-таки лишь проблемы визуализации: $ find . -type f ./афаййей ./1251/ЮТЮИИЕИ ./utf8/п╟я└п╟п╧п╧п╣п╧ Всё на месте. Eugene --- slrn/1.0.2 (FreeBSD) |
#56
|
|||
|
|||
tar: Can't translate pathname to UTF-8
Victor Sudakov написал(а) к Alex Korchmar в Apr 18 08:19:38 по местному времени:
Dear Alex, 02 Apr 18 14:37, Alex Korchmar wrote to me: AK>>> у него нет таких ключей. "кодировки" windows/dos - это для AK>>> перекодирования файлов, а не их имен. VS>> И в страшном сне не приснится мне архиватор, который вздумает VS>> перекодировать файлы (в смысле их содержимое). AK> во времена pkzip (аналогом которого является info*) было востребовано. AK> Оно еще и crlf на lf заменять умеет. Когда-то и в FTP был ascii режим, кто об этом помнит. VS>> По крайней мере если сделать "unzip -t -O cp1251 1.zip" AK> у меня как была бнопня, так и осталась. VS>> $ echo $LANG VS>> ru_RU.KOI8-R AK> кодировка_терминала. Плевать он хотел на LANG. Какого терминала, как архиватор может ее узнать? Терминал в приведенном примере вообще был PuTTY, и Remote Character Set в данной сессии стоял KOI8-R. Victor Sudakov, VAS4-RIPE, VAS47-RIPN --- GoldED+/BSD 1.1.5-b20160322-b20160322 |
#57
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Alex Korchmar написал(а) к Victor Sudakov в Apr 18 11:23:57 по местному времени:
From: Alex Korchmar <noreply@linux.e-moe.ru> Victor Sudakov <Victor.Sudakov@f49.n5005.z2.fidonet.org> wrote: AK>> кодировка_терминала. Плевать он хотел на LANG. VS> Какого терминала, твоего.Чтобы понять - это он у тебя сам что-то перекодировал, или нет. unzip из портов, как я убедился, ничего сам не перекодирует, не умеет. > Alex --- ifmail v.2.15dev5.4 |
#58
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Alex Korchmar написал(а) к Eugene Grosbein в Apr 18 11:27:27 по местному времени:
From: Alex Korchmar <noreply@linux.e-moe.ru> Eugene Grosbein <Eugene.Grosbein@f1.n5006.z2.fidonet.org> wrote: EG> Ты же не знаешь, где и как создан tar, так почему ты считаешь, что он внутри EG> испорчен - только потому, что лично ты ниасилил его развернуть? ну асиль, асиль - ты мне уже второй месяц рассказываешь, как оно все должно быть, только нихрена что-то ни один совет не работает. EG> Опять приходится догадываться, что локаль у тебя KOI8-R, любая отличная от utf8 EG> не повторяет байтов, сохранённых в самом архиве, хотя и может символы utf8 - терминальные. В отличие от того, что в этом архиве. > Alex --- ifmail v.2.15dev5.4 |
#59
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Alex Korchmar написал(а) к Eugene Grosbein в Apr 18 11:30:31 по местному времени:
From: Alex Korchmar <noreply@linux.e-moe.ru> Eugene Grosbein <Eugene.Grosbein@f1.n5006.z2.fidonet.org> wrote: EG> Опять же неправда, так как в "чистой" локали koi8-r всё работает: ты уверен что это - "все работает"? EG> a utf8/п\260я\204п\260п\271п\271п\265п\271 а вот это - точно юникод? А не "юникод, перекодированный как восьмибитная кодировка". EG> Но у тебя, помнится, не чистая локаль - что-то в KOI8-R, LCCTYPE - koi, LANG не установлен, не думаю что LCMESSAGES может на это влиять. > Alex --- ifmail v.2.15dev5.4 |
#60
|
|||
|
|||
Re: tar: Can't translate pathname to UTF-8
Alex Korchmar написал(а) к Eugene Grosbein в Apr 18 11:31:01 по местному времени:
From: Alex Korchmar <noreply@linux.e-moe.ru> Eugene Grosbein <Eugene.Grosbein@f1.n5006.z2.fidonet.org> wrote: EG> Вот тут ошибся - tar на фре умеет создавать zip, так как он EG> просто обёртка над libarchive. Собственно, в man tar есть пример: EG> tar -a -cf archive.zip source.c source.h учитывая, что оно перекодирует до запихивания в архив, от такого зипа пользы не больше чем от тара. > Alex --- ifmail v.2.15dev5.4 |