Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

имена файлов

1 view
Skip to first unread message

Stas Mishchenkov

unread,
May 23, 2020, 6:55:01 AM5/23/20
to
Hi, All!

На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда отдает их
в cp1251. Если нужно создать список файлов в cp866, то в именах файлов иногда
встречается следующее:
cp1251: Ленинград - Ах уехала жена.mp3
cp866: Ленинград ? Ах уехала жена.mp3
Как правильно избежать такой ситуации, ну, кроме переименования файлов,
разумеется?

Have nice nights.
Stas Mishchenkov.

Alexey Vissarionov

unread,
May 23, 2020, 7:40:01 AM5/23/20
to
Доброго времени суток, Stas!
23 May 2020 13:44:10, ты -> All:

SM> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM> отдает их в cp1251. Если нужно создать список файлов в cp866, то
SM> в именах файлов иногда встречается следующее:
SM> cp1251: Ленинград - Ах уехала жена.mp3
SM> cp866: Ленинград ? Ах уехала жена.mp3
SM> Как правильно избежать такой ситуации,

Да в общем-то ничего сложного...

SM> ну, кроме переименования файлов, разумеется?

Значит, никак.


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... Овощ вам в помощь - в смысле, хрен с вами!

Alexander N. Skovpen

unread,
May 23, 2020, 2:10:01 PM5/23/20
to
Hello Stas Mishchenkov!

23 May 20 13:44:10, Stas Mishchenkov wrote to All:

SM> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM> отдает их в cp1251. Если нужно создать список файлов в cp866, то в
SM> именах файлов иногда встречается следующее:
SM> cp1251: Ленинград - Ах уехала жена.mp3
SM> cp866: Ленинград ? Ах уехала жена.mp3
SM> Как правильно избежать такой ситуации, ну, кроме переименования файлов,
SM> разумеется?
А как ты CP1251 в CP866 перекодируешь?

Alexander


Stas Mishchenkov

unread,
May 23, 2020, 3:00:01 PM5/23/20
to
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 почему-то
под разной виндой выдает разное при одной и той же локали.

Stas Mishchenkov

unread,
May 23, 2020, 3:00:01 PM5/23/20
to
Hi, Alexey!

23 май 20 14:23, Alexey Vissarionov -> Stas Mishchenkov:

SM>> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM>> отдает их в cp1251. Если нужно создать список файлов в cp866, то
SM>> в именах файлов иногда встречается следующее:
SM>> cp1251: Ленинград - Ах уехала жена.mp3
SM>> cp866: Ленинград ? Ах уехала жена.mp3
SM>> Как правильно избежать такой ситуации,

AV> Да в общем-то ничего сложного...

Что-то мне подсказывает, что лазейка есть, ииначе бы не спрашивал.

SM>> ну, кроме переименования файлов, разумеется?

AV> Значит, никак.

Этого я и боялся. Не, для себя под полумух я делал скриптик на REXX-е, который
транслитерировал и переименовывал файлы, причем не по правилам жертв ЕГЭ, а
старорежимно правильно. Хотелось бы обойтись в этот раз...

Eugene Grosbein

unread,
May 23, 2020, 9:15:01 PM5/23/20
to
23 мая 2020, суббота, в 13:44 NOVT, Stas Mishchenkov написал(а):

SM> Hа ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM> отдает их
SM> в cp1251. Если нужно создать список файлов в cp866, то в именах файлов
SM> иногда
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аучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.

Eugene Grosbein

unread,
May 24, 2020, 3:05:02 AM5/24/20
to
24 мая 2020, воскресенье, в 07:57 NOVT, Eugene Grosbein написал(а):

EG> Тут символ многоточия заменяется на три точки, варианты тире
EG> на дефис, символ копирайта на (R) и так далее.

Hе копирайта, а оригинала, конечно.

Eugene

Stas Mishchenkov

unread,
May 24, 2020, 8:35:01 AM5/24/20
to
Hi, Eugene!

24 май 20 07:57, Eugene Grosbein -> Stas Mishchenkov:

EG> Если в таблице тупо нет символа, то ты можешь только подобрать
EG> более-менее подходящий по виду символ или группу символов для замены.

Ну, да. Иначе никак.

EG> CP866 отличается от KOI8-R только порядком символов в таблице,
EG> а сам набор символов тот же самый, поэтому тебе, может быть,
EG> пригодится готовая таблица для такиз замен за авторством
EG> покойного Чернова из его утилиты fromwin, правда в синтаксисе C:

Спасибо. То, что нужно.

EG> win2koi8[] = {
EG> "Ъ", "Г", "\'", "г", "\"", "...", "+", "+", /* 80-87

Как я понял, кириллические символы я здесь вижу уже в cp866, а коментарии - это
номера симфволов в cp1251?

Alexander N. Skovpen

unread,
May 24, 2020, 9:15:01 AM5/24/20
to
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


Eugene Grosbein

unread,
May 24, 2020, 1:35:01 PM5/24/20
to
24 мая 2020, воскресенье, в 15:28 NOVT, Stas Mishchenkov написал(а):

EG>> win2koi8[] = {
EG>> "Ъ", "Г", "\'", "г", "\"", "...", "+", "+", /* 80-87
SM> Как я понял, кириллические символы я здесь вижу уже в cp866,

Символы это символы, это алфавит кодировки.

Буква "Г" русского языка один и тот же символ что в cp866,
что в koi8-r, что в win1251 и даже в Unicode,
разница только в машинном представлении.
В данной таблице ты видишь символы и их положение в koi8-r.

SM> а коментарии - это номера симфволов в cp1251?

Hет, это номера символов в koi8-r в данном случае.

Eugene

Stas Mishchenkov

unread,
May 24, 2020, 5:10:01 PM5/24/20
to
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 в данном случае.

Разобрался. Все оказалось, как я и предположил. Сделал рабочую процедуру. Хотя,
может быть, очень криво.

Stas Mishchenkov

unread,
May 24, 2020, 5:15:01 PM5/24/20
to
*** Ответ на сообщение из _Carbon.Mail (Carbon.Mail).

Hi, Alexey!

23 май 20 14:23, Alexey Vissarionov -> Stas Mishchenkov:

SM>> На ntfs имена файлов хранятся в UTF-16, в консоль при этом винда
SM>> отдает их в cp1251. Если нужно создать список файлов в cp866, то
SM>> в именах файлов иногда встречается следующее:
SM>> cp1251: Ленинград - Ах уехала жена.mp3
SM>> cp866: Ленинград ? Ах уехала жена.mp3
SM>> Как правильно избежать такой ситуации,

AV> Да в общем-то ничего сложного...

SM>> ну, кроме переименования файлов, разумеется?

AV> Значит, никак.

Избежал. Спасибо. Подскажи лучше в линуксчайнмке.

Stas Mishchenkov

unread,
May 24, 2020, 10:45:01 PM5/24/20
to
*** Ответ на сообщение из _Carbon.Mail (Carbon.Mail).

Hi, Alexander!

24 май 20 16:12, Alexander N. Skovpen -> Stas Mishchenkov:

ANS>>> А как ты CP1251 в CP866 перекодируешь?
SM>> use Encode 'decode';
SM>> use Encode 'encode';
SM>> $fname = encode( 'cp866', decode( 'cp1251', $key ) ) if $^O eq
SM>> 'MSWin32';

ANS> а если 'use utf8;' добавить?

А зачем? В cp866 от этого совмечтимые символы не появятся же?

Stas Mishchenkov

unread,
May 25, 2020, 8:00:01 AM5/25/20
to
Hi, Eugene!

25 май 20 00:15, Eugene Grosbein -> Stas Mishchenkov:

EG> В данной таблице ты видишь символы и их положение в koi8-r.

SM>> а коментарии - это номера симфволов в cp1251?

EG> Hет, это номера символов в koi8-r в данном случае.

Между тем, я проверил свое предположение и оно оказалось верным. Всё чудесно
перекодируется. Спасибо.
0 new messages