Ваша система, как и любая другая система Windows, которую я знаю, по умолчанию использует кодовую страницу 1252 ANSI, поэтому вы можете попробовать использовать
use Encode qw( decode );
@ARGV = map { decode('cp1252', $_) } @ARGV;
Обратите внимание, что cp1252 не может представлять все эти символы, поэтому консоль и, следовательно, Perl фактически получают
- 97
- 223
- ? 63
- д 100
- е 101
- ? 63
Существует "широкий" интерфейс для передачи (почти) любой кодовой точки Unicode в программу, но
- Широкий интерфейс не используется при вводе команды в командной строке.
- Perl использует интерфейс ANSI для извлечения параметров, поэтому даже если вы запустили Perl с использованием широкого интерфейса, параметры будут понижены до ANSI, когда Perl их получит.
Извините, но это ситуация типа "вы не можете". Вам нужен другой подход. Диомидис Спинеллис предлагает изменить кодовую страницу ANSI вашей системы следующим образом в Win7:
- Панель управления
- Регион и язык
- Административные
- Язык для не-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