你的系统,就像我知道的每个 Windows 系统一样,默认使用 1252 ANSI 代码页,所以你可以尝试使用
use Encode qw( decode );
@ARGV = map { decode('cp1252', $_) } @ARGV;
请注意,cp1252 不能代表所有这些字符,这就是控制台和 Perl 实际接收的原因
- 97
- ß 223
- ? 63
- d 100
- 101
- ? 63
有一个“宽”接口用于将(几乎)任何 Unicode 代码点传递给程序,但是
- 当您在提示符处键入命令时,不使用 Wide 界面。
- Perl 使用 ANSI 接口来获取参数,因此即使您使用 Wide 接口启动 Perl,当 Perl 获取参数时,参数也会降级为 ANSI。
抱歉,这是一种“你不能”的情况。你需要一种不同的方法。Diomidis Spinellis 建议在 Win7 中更改系统的 ANSI 代码页,如下所示:
- 控制面板
- 地区和语言
- 行政的
- 非 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
活动代码页:737
C:\>回波αβγδεζ | od -t x1
0000000 98 99 9a 9b 9c 9d 20 0d 0a
C:\>perl -e "打印映射 sprintf('%x', ord($_)), split(//, $ARGV[0])" αβγδεζ
e1 e2 e3 e4 e5 e6
C:\>chcp 1253
活动代码页:1253
C:\>回波αβγδεζ | od -t x1
0000000 e1 e2 e3 e4 e5 e6 20 0d 0a
C:\>perl -e "打印映射 sprintf('%x', ord($_)), split(//, $ARGV[0])" αβγδεζ
e1 e2 e3 e4 e5 e6