【问题标题】:What -C flag number in perl makes UTF-8 "just work"?perl 中的什么 -C 标志号使 UTF-8 “正常工作”?
【发布时间】:2015-08-02 16:10:14
【问题描述】:

我的设置:perl-5.20.2,UTF-8 环境。

考虑以下两个 bash 示例。第一个工作正常,第二个不行。

echo -n 'привет мир' | perl -MEncode -le '$a=decode("utf8",<>); $x=decode("utf8","мир"); print encode("utf8",sprintf("% 11s",$a)) if $a=~/$x/'|grep -q ' привет мир' && echo OK
for (( i=0; $i < 512; i=$((i+1)) )); do echo -n 'привет мир' | perl -C$i -le '$a=<>; print sprintf("% 11s",$a) if $a=~/мир/' | grep -q ' привет мир' && echo $i; done

为什么情况2)中没有-C标志号,这使得示例至少可以工作一次?

【问题讨论】:

  • 你可以使用-Mutf8

标签: perl utf-8 utf8-decode


【解决方案1】:

为什么没有 -C 标志号...这使得示例至少可以运行一次?

因为在 Perl 源代码中使用 UTF-8 文字需要 use utf8;

for (( i=0; $i < 512; i=$((i+1)) )); do echo -n 'привет мир' | perl -C$i -le 'use utf8; $a=<>; print sprintf("% 11s",$a) if $a=~/мир/' | grep -q ' привет мир' && echo $i; done

没有可以复制use utf8;-C 值。对于use utf8-C 的任何奇数值都通过了测试(STDIN 假定为 UTF-8),但除非您还将 STDOUT 设置为 UTF-8,否则您会收到“打印中的宽字符”警告。

所以,-C3 有效,任何数字 $i % 4 == 3 也有效。对于 1-liner,您可能希望 -CSDA (-C63) 说所有 I/O 和 @ARGV 都应该是 UTF-8。

您也可以使用-Mutf8 选项,而不是将use utf8; 放入您的1-liner。 -mutf8 不起作用,因为它等效于 use utf8 (); 并且括号阻止调用 import 方法。由于 import 方法将您的源代码标记为 UTF-8,因此 -mutf8 什么也不做。但是-Mutf8 等价于use utf8;,所以它可以工作。

但是,将 -Mutf8 放入 PERL5OPT 可能会破坏任何使用非 ASCII ISO-8859-1 文字的脚本。这可能是您愿意承担的风险,但您应该意识到这一点。

【讨论】:

  • 有什么奇怪的:我试过-mutf8,但没用; use utf8 我没想到。为什么-mutf8 不起作用? perl 命令行选项中是否有此编译指示的替代品? - 我想创建一个别名,因为我总是使用 UTF-8,在我的休闲单行中添加额外的乱码对我没有吸引力。
  • @IgorLiferenko,我已经扩展了我的答案以解释 -mutf8-Mutf8
  • 一个细节:在我写的代码use strict,在命令行-mstrict。为什么会出现这种不一致?在 perl 命名约定中,模块名称以大写字母开头,而 pragma 名称以小写字母开头,不是吗?
  • @IgorLiferenko,您可以在命令行上使用-mstrict,但它实际上不会做任何事情。如果你真的想开启严格模式,你必须使用-Mstrict,原因与我为-Mutf8 给出的原因相同。
猜你喜欢
  • 1970-01-01
  • 2016-04-09
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多