运行以下命令
perl -e "for (my $i = 0; $i < length($ARGV[0]); $i++) {print ord(substr($ARGV[0], $i, 1)), qq{\n}; }" αβγδεζ
在具有ActiveState Perl v5.14.2的Windows 7 cmd窗口上的产生以下结果:
97
223
63
100
101
63
以上值无意义且与任何已知编码不对应,因此尝试使用建议的方法解码它们 How can I treat command-line arguments as UTF-8 in Perl?无济于事。更改命令窗口活动代码页不会更改结果。
答案 0 :(得分:3)
您的系统与我所知道的每个Windows系统一样,默认使用1252 ANSI代码页,因此您可以尝试使用
use Encode qw( decode );
@ARGV = map { decode('cp1252', $_) } @ARGV;
请注意,cp1252不能代表所有这些字符,这就是控制台和Perl实际接收的原因
有一个“宽”接口,用于将(几乎)任何Unicode代码点传递给程序,但
抱歉,这是一种“你不能”的情况。你需要一个不同的方法。 Diomidis Spinellis建议在Win7中更改系统的ANSI代码页:
此时,您将使用与新选择的编码关联的ANSI代码页的编码,而不是cp1252
(希腊语为cp1253
)。
use Encode qw( decode );
@ARGV = map { decode('cp1253', $_) } @ARGV;
请注意,使用chcp
修改控制台窗口中使用的代码页不会影响Perl接收其参数的代码页,该参数始终是ANSI代码页。请参阅下面的示例(cp737是希腊语OEM code page,cp1253是希腊语ANSI code page。您可以在this document中找到标记为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
答案 1 :(得分:0)
这对我有用(在OS-X上,但应该是可移植的):
echo αβγδεζ |perl -CI -e "chomp($in=<STDIN>);for (my $i = 0; $i < length($in); $i++) {print ord(substr($in, $i, 1)), qq{\n}; }"
那是STDIN;对于ARGV:
perl -CA -e "for (my $i = 0; $i < length($ARGV[0]); $i++) {print ord(substr($ARGV[0], $i, 1)), qq{\n}; }" αβγδεζ
请参阅perlrun中的-C
选项:http://perldoc.perl.org/perlrun.html#Command-Switches
答案 2 :(得分:0)
如果我将字符放在一个文件中(来自OS-X),请将其复制到一个Windows框(如file.txt
),然后运行:
perl -CI -e "chomp($_=<STDIN>); map{print ord, qq{\n}} split(//)" < file.txt
然后我得到了预期的结果:
946
947
948
949
950
但是,如果我将file.txt
的内容复制到命令行,我会感到胡言乱语。
正如@ikegami所说,我不认为可以从命令行执行,因为你没有UTF-8语言环境。
答案 3 :(得分:0)
您可以尝试使用https://metacpan.org/pod/Win32::Unicode::Native。它应该有你需要的东西。