【发布时间】:2014-12-03 19:52:39
【问题描述】:
当 regexp 仅包含 ascii 字符时,UTF-8 编码字符串的字符串替换工作正常,但当 regexp 包含非 ascii 时会产生乱码输出。
my $str = "¿más?";
$str =~ s/[?]//g;
print "$str\n";
==> ¿más
$str =~ s/[¿]//g;
print "$str\n";
==> 米
更新:上面的答案清楚地表明我最初的问题的框架很差。答案集中在 STDOUT 上,但在我的实际问题中,我没有打印到 STDOUT。 (我这样做只是为了简化问题陈述)。在实际问题中,我从 sqlite 存储中检索数据并使用数据作为文件名来搜索文件系统。当我对检索到的数据应用清理例程时,某些文件名会出现乱码。
查看这一点的一种方法可能是进一步简化示例:
my $str = "más";
$str =~ s/[?]//g;
print "$str\n";
==> 更多
$str =~ s/[¿]//g;
print "$str\n";
==> 米
现在您可以看到@ikegami 的解释不适用。关于第二个 s/// 的某些东西会造成问题。公平地说,这两个答案都解决了上述问题 - 但任何额外的见解将不胜感激!
更新 2:根据要求,添加了 sprintf 的矢量标志输出。注意:还将目标替换字符从 ¿ 更改为 ¡ - 我现在认为我上面的代码(如 @ikegami 建议的那样)一定是复制不正确。
my $str = "más";
printf "%v02X\n", $str;
==> 6D.C3.A1.73
$str =~ s/[!]//g;
printf "%v02X\n", $str;
==> 6D.C3.A1.73
print "$str\n";
==> 更多
$str =~ s/[¡]//g;
printf "%v02X\n", $str;
==> 6D.C3.73
print "$str\n";
==> 米
【问题讨论】:
-
尽管您在更新中声明了什么,但我没有提到 STDOUT。
-
@ikegami - 添加了您要求的信息;另请参阅有关 ¿ 与 ¡ 的说明