From: Stas Mishchenkov 2:460/5858 23 May 2020 21:44 +0300
To: Alexander N. Skovpen 2:5020/9696
Subject: имена файлов
Hi, Alexander! 23 май 20 21:07, Alexander N. Skovpen -> Stas Mishchenkov: SM>> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда SM>> отдает их в cp1251. Если нужно создать список файлов в cp866, то в SM>> именах SM>> файлов иногда встречается следующее: SM>> cp1251: Ленинград - Ах уехала жена.mp3 SM>> cp866: Ленинград ? Ах уехала жена.mp3 SM>> Как правильно избежать такой ситуации, ну, кроме переименования файлов, SM>> разумеется? ANS> А как ты CP1251 в CP866 перекодируешь? use Encode 'decode'; use Encode 'encode'; $fname = encode( 'cp866', decode( 'cp1251', $key ) ) if $^O eq 'MSWin32'; кстати, почему-то from_to не срабатывает, хотя внутри у нее как раз то же самое. и еще один вопрос попутно... if $^O eq 'MSWin32'; - не совсем корректная проверка, но setlocale почему-то под разной виндой выдает разное при одной и той же локали. Have nice nights. Stas Mishchenkov.
From: Stas Mishchenkov 2:460/5858 23 May 2020 13:44 +0300
To: All
Subject: имена файлов
Hi, All! На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда отдает их в cp1251. Если нужно создать список файлов в cp866, то в именах файлов иногда встречается следующее: cp1251: Ленинград - Ах уехала жена.mp3 cp866: Ленинград ? Ах уехала жена.mp3 Как правильно избежать такой ситуации, ну, кроме переименования файлов, разумеется? Have nice nights. Stas Mishchenkov.
From: Eugene Grosbein grosbein.net 25 Apr 2020 21:31 +0300
To: Gennadij Pastuhov 2:5036/26
Subject: Что за фигня?
25 апр. 2020, суббота, в 07:08 NOVT, Gennadij Pastuhov написал(а): GP>>> Дано: хэш: GP>>> my $PRODUCTS = { GP>>> ssl_dv_geotrust => 'GeoTrust Standard DV SSL Certificate', GP>>> ssl_dv_rapidssl => 'RapidSSL Standard DV SSL Certificate', GP>>> ssl_dv_thawte => 'Thawte SSL123 DV', GP>>> }; GP>>> Кусок кода: GP>>> for my $key (keys $result) { GP>>> print "\nkey:" . Dumper $key; GP>>> my ($product_name_id, $validity_years) = split GP>>> '__', $key; GP>>> print GP>>> "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$validity_ EG>> years'"; GP>>> if (defined $PRODUCTS->{$product_name_id}) { GP>>> ... GP>>> } else { GP>>> print "\nproduct_name_id:$product_name_id -- not found"; GP>>> print "\nPRODUCTS:" . Dumper $PRODUCTS->{$product_name_id}; GP>>> В $result хранится результат разjsonивания запроса. И этот код GP>>> порождает такой GP>>> лог: GP>>> key:$VAR1 = 'ssl_dv_thawte__2'; GP>>> product_name_id:'ssl_dv_thawte' validity_years:'2' GP>>> product_name_id:ssl_dv_thawte -- not found GP>>> PRODUCTS:$VAR1 = undef; GP>>> Даже не представляю, куда копать. Если взять вот эти тексты и GP>>> выполнить в GP>>> скрипте, то всё работает. Т.е., как будто эти латинские буквы в GP>>> работе какие-то GP>>> не те. Или меня глючит? EG>> Вообще удивляюсь, что у тебя хоть что-то печатает, EG>> потому что вызов keys $result некорректен и ты, EG>> очевидно, не используешь use strict и use warnings, EG>> которые обязательно нужно всегда использовать. EG>> keys берёт аргументом хеш или список, а у тебя скаляр. EG>> Добавляй use strict и use warnings, исправляй все ошибки EG>> в коде, на которые они укажут и пробуй снова. GP> Hачало того скрипта: GP> use strict; GP> use warnings; GP> use utf8; А тогда всё зависит от версии perl. Типа намёк. Eugene
From: Gennadij Pastuhov 2:5036/26 26 Apr 2020 12:26 +0300
To: Eugene Grosbein grosbein.net
Subject: Что за фигня?
Рад всех приветствовать! А особенно - Eugene! Воскресенье апреля 26 20 15:44 Eugene Grosbein писал к Gennadij Pastuhov: GP>>>>>>>> Кусок кода: GP>>>>>>>> for my $key (keys $result) { EG>>> Это довольно старая версия perl и какие в ней были EG>>> баги/особенности, EG>>> сейчас тебе тут вряд ли кто ответит. Проще всего заменить EG>>> весь твой диагностический вывод на один print Dumper($result) EG>>> и поглядеть на него. Вывод в студию. GP>> Без проблем. Hо не весь, а только нужные строки, остальные GP>> аналогичные: GP>> result:$VAR1 = { GP>> 'ssl_dv_thawte__2' => 10, GP>> }; EG> Фигурные скопбки означают, что $result это ссылка на хеш, EG> так что всё-таки лучше бы ты писал как положено EG> keys %{$result} вместо твоего keys $result. EG> Я удивлён, что старый perl при strict/warnings это пропустил. Это да, спасибо, пропустил. Результат не изменился. ... Jonny wanna live
From: Eugene Grosbein grosbein.net 27 Apr 2020 06:16 +0300
To: Gennadij Pastuhov 2:5036/26
Subject: Что за фигня?
24 апр. 2020, пятница, в 18:56 NOVT, Gennadij Pastuhov написал(а): GP> if (defined $PRODUCTS->{$product_name_id}) { Думаю, что ошибка тут. Вместо defined тут необходимо использовать exists, потому что иначе срабатывает autovivification: https://perlmaven.com/autovivification GP> product_name_id:ssl_dv_thawte -- not found GP> PRODUCTS:$VAR1 = undef; Eugene -- Чтобы всё как у всех, но чтоб при этом - не так, как они.
From: Gennadij Pastuhov 2:5036/26 06 May 2020 23:21 +0300
To: Eugene Grosbein grosbein.net
Subject: apache utf8 uri escaping?
Рад всех приветствовать! А особенно - Eugene! Четверг мая 07 20 01:22 Eugene Grosbein писал к Gennadij Pastuhov: GP>> GP>> RewriteEngine on GP>> RewriteRule (.*) <тут поскипано>/%D0%B3%D1%83%D0%B4 [R=301,NE,L] GP>> GP>> Т.е., предполагается, что при заходе на сервер будет GP>> перенаправление на GP>> страницу с окончанием 'гуд'. При попытке зайти (хоть курлом) GP>> фактически отдаётся GP>> адрес /%D0%B3%D13%D0%B4 (г3д). Возникло предположение, что движок GP>> mod_rewrite GP>> воспринял %8, как backreference, и выбросил его. Попробовали GP>> вручную вписать в GP>> конфиг: /\%D0\%B3\%D1\%83\%D0\%B4 - так RewriteRule заработало GP>> нормально. GP>> Вопросы: верное ли это предположение? Если конфиг апача генерится GP>> эхотагом, то, GP>> получается, нужно подобные строки (содержащие %), прогонять GP>> через: s/%/\\%/g ? GP>> И риторический: долгое гугление на эту тему вообще ничего не GP>> дало, как будто GP>> такая проблема возникла первый раз. Правда, что ли? EG> Hадо было не гуглить, а *внимательно* читать документацию EG> на директиву RewriteRule. EG> http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule EG> Pattern is a perl compatible regular expression. On the first EG> RewriteRule it is applied to the (%-decoded) URL-path of the request; EG> subsequent patterns are applied to the output of the last matched EG> RewriteRule. EG> Ключевое слово %-decoded. То есть матчить надо уже декодированную EG> строку. Если же у тебя реально матчятся %-кодированные данные, значит EG> твои ссылки некорректно дважды %-кодируются при генерации. Я не очень большой спец по апачу, не очень понял ответ. То, что RewriteRule применяется к %-decoded, означает, что сначала строка из директивы декодируется, а потом к ней применяется правило? Или что правило уже должно быть записано в декодированном виде? Сейчас, насколько я понимаю, в конфиг передаются строки, прошедшие код типа этого: use URI::Escape; my $url = '/гуд'; my $escaped = uri_escape_utf8($url); print "Esc: " . $escaped; Esc: %2F%D0%B3%D1%83%D0%B4 ... Jonny wanna live
From: Stas Mishchenkov 2:460/5858 25 May 2020 00:00 +0300
To: Eugene Grosbein grosbein.net
Subject: имена файлов
Hi, Eugene! 25 май 20 00:15, Eugene Grosbein -> Stas Mishchenkov: EG>>> win2koi8[] = { EG>>> "Ъ", "Г", "\'", "г", "\"", "...", "+", "+", /* EG>>> 80-87 SM>> Как я понял, кириллические символы я здесь вижу уже в cp866, EG> Символы это символы, это алфавит кодировки. EG> Буква "Г" русского языка один и тот же символ что в cp866, EG> что в koi8-r, что в win1251 и даже в Unicode, EG> разница только в машинном представлении. EG> В данной таблице ты видишь символы и их положение в koi8-r. SM>> а коментарии - это номера симфволов в cp1251? EG> Hет, это номера символов в koi8-r в данном случае. Разобрался. Все оказалось, как я и предположил. Сделал рабочую процедуру. Хотя, может быть, очень криво. Have nice nights. Stas Mishchenkov.
From: Eugene Grosbein grosbein.net 24 May 2020 13:46 +0300
To: All grosbein.net
Subject: имена файлов
24 мая 2020, воскресенье, в 07:57 NOVT, Eugene Grosbein написал(а): EG> Тут символ многоточия заменяется на три точки, варианты тире EG> на дефис, символ копирайта на (R) и так далее. Hе копирайта, а оригинала, конечно. Eugene
From: Eugene Grosbein grosbein.net 24 May 2020 07:57 +0300
To: Stas Mishchenkov 2:460/5858
Subject: имена файлов
23 мая 2020, суббота, в 13:44 NOVT, Stas Mishchenkov написал(а): SM> Hа ntfs имена файлов хранятся в UTF-16, в консоль при этом винда отдает их SM> в cp1251. Если нужно создать список файлов в cp866, то в именах файлов иногда SM> встречается следующее: SM> cp1251: Ленинград - Ах уехала жена.mp3 SM> cp866: Ленинград ? Ах уехала жена.mp3 SM> Как правильно избежать такой ситуации, ну, кроме переименования файлов, SM> разумеется? И в наборе символов Unicode (а UTF-16 лишь один из технических способов представления Unicode), и в наборе символов cp1251 есть символы, которых тупо нет в cp866, таких как длинное тире или "типографские кавычки". Если в таблице тупо нет символа, то ты можешь только подобрать более-менее подходящий по виду символ или группу символов для замены. CP866 отличается от KOI8-R только порядком символов в таблице, а сам набор символов тот же самый, поэтому тебе, может быть, пригодится готовая таблица для такиз замен за авторством покойного Чернова из его утилиты fromwin, правда в синтаксисе C: win2koi8[] = { "Ъ", "Г", "\'", "г", "\"", "...", "+", "+", /* 80-87 */ "#", "%", "ЛЬ", "<", "HЬ", "К", "h", "Ц", /* 88-8F */ "h", "`", "\'", "\"", "\"", "\x95", "-", "-", /* 90-97 */ "#", "(TM)", "ль", ">", "нь", "к", "h", "ц", /* 98-9F */ "\x9A", "У", "у", "J", "$", "Г", "|", "$", /* A0-A7 */ "\xB3", "\xBF", "Е", "\"", "^", "-", "(R)", "I", /* A8-AF */ "\x9C", "+", "I", "i", "г", "m", "#", "\x9E", /* B0-B7 */ "\xA3", "N", "е", "\"", "j", "S", "s", "i", /* B8-BF */ "\xE1", "\xE2", "\xF7", "\xE7", "\xE4", "\xE5", "\xF6", "\xFA", /* C0-C7 */ "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF", "\xF0", /* C8-CF */ "\xF2", "\xF3", "\xF4", "\xF5", "\xE6", "\xE8", "\xE3", "\xFE", /* D0-D7 */ "\xFB", "\xFD", "\xFF", "\xF9", "\xF8", "\xFC", "\xE0", "\xF1", /* D8-DF */ "\xC1", "\xC2", "\xD7", "\xC7", "\xC4", "\xC5", "\xD6", "\xDA", /* E0-E7 */ "\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0", /* E8-EF */ "\xD2", "\xD3", "\xD4", "\xD5", "\xC6", "\xC8", "\xC3", "\xDE", /* F0-F7 */ "\xDB", "\xDD", "\xDF", "\xD9", "\xD8", "\xDC", "\xC0", "\xD1" /* F8-FF */ }; Тут символ многоточия заменяется на три точки, варианты тире на дефис, символ копирайта на (R) и так далее. Eugene -- Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что жизнь меняется необычайно быстро.
From: "Alexander N. Skovpen" 2:5020/9696 24 May 2020 16:12 +0300
To: Stas Mishchenkov 2:460/5858
Subject: имена файлов
Hello Stas Mishchenkov! 23 May 20 21:44:36, Stas Mishchenkov wrote to Alexander N. Skovpen: ANS>> А как ты CP1251 в CP866 перекодируешь? SM> use Encode 'decode'; SM> use Encode 'encode'; SM> $fname = encode( 'cp866', decode( 'cp1251', $key ) ) if $^O eq 'MSWin32'; а если 'use utf8;' добавить? Alexander