2015-02-02 6 views
0

Я стараюсь иметь специальные символы немецкого языка: öäüßÖÄÜ на выходе приложения ma perl console, но я не смог. Это немецкая система win7 с активной кодовой страницы 850.perl special char windows

#!/usr/bin/perl 
use warnings; 
use strict; 

binmode(STDOUT , ":encoding(cp437)") if $^O eq 'MSWin32'; 
#binmode(STDOUT , ":encoding(cp850)") if $^O eq 'MSWin32'; 
#binmode(STDOUT , ":encoding(cp1252)") if $^O eq 'MSWin32'; 

my @sp_chars = qw/ä ö ü ß Ä Ö Ü/; 

foreach my $sp_char (@sp_chars) { 
    print "$sp_char\n"; 
} 

Я получаю ошибки как:

"\x{009f}" does not map to cp1252 at umlaute.pl line 12. 

"\x{009f}" does not map to cp850 at umlaute.pl line 12. 

"\x{00c3}" does not map to cp437 at umlaute.pl line 12. 

Как я могу получить выход Проппер?

ответ

1

При использовании utf8 символов в исходном коде и использовать слой IO для кодирования, вы должны включить utf8 в PERL парсера:

use utf8; 

my $encoding = $^O eq 'MSWin32' ? 'cp850' : 'utf8'; 
binmode(STDOUT, ":encoding($encoding)"); 

print "$_\n" for qw/ä ö ü ß Ä Ö Ü/; 
+0

Привет Бен, «пришедший из исходного кода» был намеком я необходимо. Я пропустил суть, что блокнот ++ был установлен в utf8. Большое спасибо! Pete – Pete

+0

@Pete: Правильное решение состоит в том, чтобы * сказать * Perl, что источник находится в UTF-8, добавив 'use utf8' в качестве первого оператора в исходном файле. Сейчас необычно использовать кодовую страницу 850 (DOS Latin 1), поскольку ISO-8859-1 (кодовая страница 1252, кроме нескольких мелочей) в значительной степени заменил ее. Возможно, вам проще использовать UTF-8 повсюду, что поддерживается с помощью кодовой страницы Windows 65001. – Borodin

+0

Правильно, если вы намерены использовать слой кодирования в любом месте своей программы, ваши данные должны быть последовательно представлены. Обычно _easier_ обрабатывать все как байты, поэтому я обычно не включаю utf8, даже когда у меня есть utf8-символы в источнике. Но я обновлю ответ, потому что это более современный способ сделать это :) –