我有Perl和编码编译指示的问题.
(我在输入,输出,perl脚本本身使用utf-8.我不想使用其他编码,从来没有.)
然而.当我写作
binmode(STDOUT, ':utf8');
use utf8;
$r = "\x{ed}";
print $r;
Run Code Online (Sandbox Code Playgroud)
我看到字符串" í "(这就是我想要的 - 以及什么是U + 00ED unicode char).但是当我添加像这样的"使用编码"pragma时
binmode(STDOUT, ':utf8');
use utf8;
use encoding 'utf8';
$r = "\x{ed}";
print $r;
Run Code Online (Sandbox Code Playgroud)
我所看到的只是一个盒子角色.为什么?
而且,当我添加Data :: Dumper并让Dumper打印出这样的新字符串时
binmode(STDOUT, ':utf8');
use utf8;
use encoding 'utf8';
$r = "\x{ed}";
use Data::Dumper;
print Dumper($r);
Run Code Online (Sandbox Code Playgroud)
我看到perl 将字符串更改为"\x{fffd}".为什么?
use encoding 'utf8'被打破.它不是将其解释\x{ed}为代码点U + 00ED,而是将其解释为单个字节237,然后尝试将其解释为UTF-8.当然哪个失败了,所以它最终用替换字符U + FFFD替换它,字面意思是" ".
只需坚持use utf8指定您的源是UTF-8,binmode或者使用open pragma来指定文件句柄的编码.
您的实际代码既不需要use encoding也不需要use utf8正常运行 - 它唯一依赖的是编码层STDOUT.
binmode(STDOUT, ":utf8");
print "\xed";
Run Code Online (Sandbox Code Playgroud)
是一个同样有效的完整程序,可以满足您的需求.
use utf8 只有在程序中的文字字符串中包含UTF-8时才应该使用 - 例如,如果您已经写过
my $r = "í";
Run Code Online (Sandbox Code Playgroud)
然后use utf8会导致该字符串被解释为单个字符U + 00ED而不是字节序列C3 AD.
use encoding永远不应该使用,特别是喜欢Unicode的人.如果你想要改变stdin/out的编码,你应该自己使用-C或者PERLUNICODEbinmode,如果你想要用编码层自动打开其他句柄你应该useopen.
| 归档时间: |
|
| 查看次数: |
2489 次 |
| 最近记录: |