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