powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Локаль в Windows
3 сообщений из 3, страница 1 из 1
Perl: Локаль в Windows
    #38845893
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
use utf8;
...
$| = 1;
binmode(STDIN, ':encoding(cp1251)');
binmode(STDOUT,':encoding(cp866)');
binmode(STDERR,':encoding(cp866)');

use Encode;
$ARGV[$_] = decode('cp1251',$ARGV[$_]) foreach (0..$#ARGV);
no Encode;
...
print $message;



Время от времени такой код выдает сообщения типа
Код: plaintext
"\x{00ab}" does not map to cp866 at ...
То есть не может вывести некоторые unicode-символы, например типографские кавычки-елочки.
Однако с клавиатуры я эти символы ввожу, и есть вывожу в консоль текстовый файл с этими кавычками, они вполне читаются.
Не подскажите, как можно настроить Perl так, чтобы юникодный текст в консоль выдавался нормально?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl: Локаль в Windows
    #38847343
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

а ты откажись от CP866 в пользу CP1251 и жизнь наладится. да хоть бы так ( перед первым оператором вывода):
Код: php
1.
use utf8; `chcp1251`; say $ARGV[0]; 
...
Рейтинг: 0 / 0
Perl: Локаль в Windows
    #38847433
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если по-взрослому, то переключать консоль надо, конечно же, не в Windows-1251, а в UTF-8,
потому что, как ни крути, а 2(и более) полноценных байт ты в один байт не впихнёшь;

есть проблема: если просто выполнить
`chcp 65001` и установить Perl I/O Layer в utf8 с помощью binmode,
то в cmd-консоли появятся юникод символы,
но в целом всё равно фигня( строчки рвутся и дублируются; я так понимаю, что всё-таки это баг Windows);

Но есть и решение:
вот такая последовательность I/O-layers :unix:utf8:crlf приводит к удовлетворительному результату

( проверял в Windows XP SP3 english )


Код: php
1.
2.
3.
4.
5.
6.
`chcp 65001`;

binmode STDOUT, ':unix:encoding(utf8):crlf';


#PS: шрифт консоли должен быть truetype ( Lucida Console, например )



Чтобы отобразились все Юникод-символы, наверное надо подключить к консоли
другие truеtype-шрифты ( с Lucida Console вместо букв квадратики )
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Локаль в Windows
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]