Perl в Windows: проблемы с кодированием

У меня проблема со скриптами Perl. В UNIX-подобных системах он правильно выводит на консоль все символы Unicode, такие как ä. В командной строке Windows символы разбиты на бессмысленные глифы. Есть ли простой способ избежать этого? Я использую use utf8;.

Заранее спасибо.


person Martin    schedule 05.03.2013    source источник
comment
Вы проверили ответы на этот вопрос: stackoverflow.com/questions/627661/   -  person default locale    schedule 05.03.2013
comment
Другой вопрос, касающийся отображения Unicode в консоли Windows: stackoverflow.com/questions/388490/   -  person default locale    schedule 05.03.2013
comment
Ненавижу-ненавижу-ненавижу-ненавижу это utf8 в прекрасном Perl   -  person gaussblurinc    schedule 05.03.2013
comment
Юникод Perl прекрасен. Я ненавижу ненавижу ненависть, потому что он не может нарушить обратную совместимость, чтобы включить его по умолчанию.   -  person Joel Berger    schedule 06.03.2013


Ответы (1)


use utf8; просто сообщает Perl, что ваш исходный код закодирован с использованием UTF-8.

В unix тоже не работает. Некоторые строки не печатаются должным образом (print chr(0xE9);), и большинство из них выводят предупреждение «Широкий символ» (print chr(0x2660);). Вам нужно декодировать свои входы и кодировать свои выходы.

В системах unix это обычно

use open ':std', ':encoding(UTF-8)';

В системе Windows вам нужно использовать chcp, чтобы найти страницу персонажа консоли. (437 для меня.)

use open ':std', ':encoding(cp437)';  # Encoding used by console
use open IO => ':encoding(cp1252)';   # Encoding used by files
person ikegami    schedule 05.03.2013
comment
Пробуя это в Windows 7 cmd.exe, он только выдавал ошибки. Odd number of elements in hash assignment at C:/strawberry/perl/lib/encoding.pm line 120. encoding: Unknown encoding ':std' at C:\Users\Peter\perl\foo.pl line 9. (то же самое для :encoding... и IO => ..). В конце концов мне удалось изменить шрифт cmd.exe на консоль Lucida, chcp 1252, а затем использовать use encoding 'cp1252'; внутри скрипта. - person TLP; 05.03.2013
comment
@TLP, исправлено. Должно быть open, а не encoding. Никогда не используйте encoding. - person ikegami; 05.03.2013
comment
+1 Это работает. Вау, столько проблем с печатью символов. - person TLP; 05.03.2013