Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Windows Новый топик    Ответить
 Кодировка UTF-8 в консоли  [new]
Alibek B.
Member

Откуда:
Сообщений: 3732
Пытаюсь научить скрипты работать с UTF-8.
Скрипты перловые, поддержка UTF включается директивой use utf8 и ключом -C. Ну и сам pl-файл разумеется в кодировке UTF.
В консоли даю команду chcp 65001.
Запускаю скрипт и сталкиваюсь с тем, что при выводе к каждой строке, где есть не ANSI-символы, добавляется разный мусор:

H:\Perl>chcp
Active code page: 65001

H:\Perl>perl test.pl
Проверка2
�ка2
Код скрипта:

#!/usr/bin/perl -C -w

use strict;
use warnings;
use utf8;

binmode(STDOUT,':utf8');
print "Проверка2\n";



________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
18 окт 12, 11:51    [13339293]     Ответить | Цитировать Сообщить модератору
 Re: Кодировка UTF-8 в консоли  [new]
Alibek B.
Member

Откуда:
Сообщений: 3732
Кстати, если сделать chcp 65001 и вывести файл в консоль (type test.pl), то кириллица читается нормально.
То есть мусор добавляет Perl (ActivePerl v5.16.1). Есть предположения, как это исправить?
Просьба модераторам перенести в соответствующую ветку.
18 окт 12, 12:39    [13339738]     Ответить | Цитировать Сообщить модератору
 Re: Кодировка UTF-8 в консоли  [new]
Alibek B.
Member

Откуда:
Сообщений: 3732
Похоже, что это проблема давняя.
Вроде бы связано с багом WriteFile, который ожидает размера данных в байтах, а Perl передает ему размер данных в символах.
Пока что использую консоль в стандартной кодировке (866) и для печати использую обертку:
use utf8;
use Encode;
sub print()
{
  foreach (@_)
  {
    my $str = encode('cp866',$_);
    print "$str\n";
  }
}


Мне хотелось бы перегрузить оператор print.
Как это сделать?
18 окт 12, 12:59    [13339881]     Ответить | Цитировать Сообщить модератору
 Re: Кодировка UTF-8 в консоли  [new]
Alibek B.
Member

Откуда:
Сообщений: 3732
Сделал так (pl-файл в кодировке UTF-8):
#!/usr/bin/perl -C -w

use strict;
use warnings;
use utf8;

binmode(STDIN, ':encoding(cp866)');
binmode(STDOUT,':encoding(cp866)');
print "Аргументы: " . join(' ',@ARGV) . "\n";


Запускаю:

H:\Perl>perl test.pl Тест
"\x{00d2}" does not map to cp866 at iptvportal.pl line 23.
"\x{00e5}" does not map to cp866 at iptvportal.pl line 23.
"\x{00f1}" does not map to cp866 at iptvportal.pl line 23.
"\x{00f2}" does not map to cp866 at iptvportal.pl line 23.
Аргументы: \x{00d2}\x{00e5}\x{00f1}\x{00f2}

Подскажите, что делаю не так?
По смыслу, для STDIN нужен слой :decoding, но такого нет.
18 окт 12, 13:33    [13340219]     Ответить | Цитировать Сообщить модератору
 Re: Кодировка UTF-8 в консоли  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10783
Alibek B.
Пытаюсь научить скрипты работать с UTF-8.
Не работает виндовая консоль c utf8 приемлимым образом.
18 окт 12, 14:29    [13340715]     Ответить | Цитировать Сообщить модератору
 Re: Кодировка UTF-8 в консоли  [new]
Alex.Ello
Guest
Столкнулся с подобной проблемой но при использовании php

решения пока так и не удалось найти =(
притом в файл вывод работает прекрасно

console.php
тест
тест 2


cmd
chcp 65001
php-cgi.exe -f console.php
��ест
тест 2�ст 2 2
18 окт 12, 15:16    [13341073]     Ответить | Цитировать Сообщить модератору
Все форумы / Windows Ответить