В вашей системе, как и во всех известных мне системах Windows, по умолчанию используется кодовая страница 1252 ANSI, так что вы можете попробовать использовать
use Encode qw( decode );
@ARGV = map { decode('cp1252', $_) } @ARGV;
Обратите внимание, что cp1252 не может представлять все эти символы, поэтому консоль и, следовательно, Perl фактически получает
- a 97
- ß 223
- ? 63
- d 100
- e 101
- ? 63
Существует «широкий» интерфейс для передачи (почти) любой кодовой точки Unicode в программу, но
- Широкий интерфейс не используется, когда вы вводите команду в командной строке.
- Perl использует интерфейс ANSI для получения параметров, поэтому, даже если вы запустите Perl с использованием интерфейса Wide, параметры будут понижены до ANSI, когда Perl их извлечет.
Извините, но это ситуация типа "вы не можете". Вам нужен другой подход. Диомидис Спинеллис предлагает изменить кодовую страницу ANSI вашей системы в Win7 следующим образом:
- Панель управления
- Регион и язык
- Административный
- Язык для программ, не поддерживающих Unicode
- Установите Текущий язык для программ, отличных от Unicode, на язык, связанный с определенными символами (в вашем случае греческий).
На этом этапе вы должны использовать кодировку кодовой страницы ANSI, связанную с новой выбранной кодировкой, вместо cp1252
(cp1253
для греческого языка).
use Encode qw( decode );
@ARGV = map { decode('cp1253', $_) } @ARGV;
Обратите внимание, что использование chcp
для изменения кодовой страницы, используемой в окне консоли, не влияет на кодовую страницу, в которой Perl получает свои аргументы, которая всегда является кодовой страницей ANSI. См. примеры ниже (cp737 — это греческая кодовая страница OEM, а cp1253 — это греческая Кодовая страница ANSI. Вы можете найти кодировки, помеченные как 37 и M7, в этот документ.)
C:\>chcp 737
Active code page: 737
C:\>echo αβγδεζ | od -t x1
0000000 98 99 9a 9b 9c 9d 20 0d 0a
C:\>perl -e "print map sprintf('%x ', ord($_)), split(//, $ARGV[0])" αβγδεζ
e1 e2 e3 e4 e5 e6
C:\>chcp 1253
Active code page: 1253
C:\>echo αβγδεζ | od -t x1
0000000 e1 e2 e3 e4 e5 e6 20 0d 0a
C:\>perl -e "print map sprintf('%x ', ord($_)), split(//, $ARGV[0])" αβγδεζ
e1 e2 e3 e4 e5 e6
person
ikegami
schedule
19.10.2011
945 946 947 948 949 950
(tlt.its.psu.edu/suggestions/international/bylanguage/) - person MisterEd   schedule 19.10.2011