Perl在Windows上:编码问题

4
我有一个关于Perl脚本的问题。在类Unix系统中,它可以正确地将所有Unicode字符如ä打印到控制台。但在Windows命令行中,这些字符会变成无意义的图形。有没有简单的方法可以避免这种情况?我正在使用use utf8;。
提前感谢您的帮助。

你有检查过这个问题的答案吗:https://dev59.com/T3RB5IYBdhLWcg3wbGtB - default locale
另一个关于在Windows控制台中显示Unicode的问题:https://dev59.com/3XRC5IYBdhLWcg3wK9yV - default locale
讨厌讨厌讨厌这个可爱的Perl中的utf8 - gaussblurinc
Perl的Unicode非常出色。但是我讨厌讨厌讨厌的是它不能打破向后兼容性以默认启用它。 - Joel Berger
1个回答

13

use utf8; 简单地告诉Perl你的源码是使用UTF-8编码的。

在Unix系统上也不起作用。有一些字符串无法正确打印(print chr(0xE9);),大多数可以打印出来但会出现“Wide character”警告(print chr(0x2660);)。你需要解码输入并编码输出。

在Unix系统中,通常这样做:

use open ':std', ':encoding(UTF-8)';

在Windows系统中,您需要使用chcp命令来查找控制台的字符页码。(对我来说是437。)
use open ':std', ':encoding(cp437)';  # Encoding used by console
use open IO => ':encoding(cp1252)';   # Encoding used by files

在Windows 7的cmd.exe中尝试此操作,但只会产生错误。C:/strawberry/perl/lib/encoding.pm第120行:哈希赋值中元素数量为奇数。C:\Users\Peter\perl\foo.pl第9行:编码:未知编码“:std”(对于:encoding...IO => ..同样适用)。最终我解决了这个问题,方法是将cmd.exe字体更改为Lucida控制台,chcp 1252,然后在脚本内使用use encoding 'cp1252'; - TLP
@TLP,已修复。应该使用“open”,而不是“encoding”。永远不要使用“encoding”。 - ikegami
1
+1,很好用。哇,为了打印字符出了这么多麻烦。 - TLP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接