如何使用UTF8制作Perl代码DWIM?

时间:2010-02-17 11:51:31

标签: perl utf-8

文件句柄上的utf8编译指示和utf8编码让我感到困惑。例如,这个明显简单的代码......

use utf8;
print qq[fü];

要清楚,“fü”上的十六进制转储是66 c3 bc,如果我没有弄错,那就是正确的UTF8。

打印66 fc,它不是UTF8,而是Unicode或者拉丁语-1。关闭use utf8,我得到66 c3 bc。这与我的期望相反。

现在让我们添加文件句式pramgas。

use utf8;
binmode *STDOUT, ':encoding(utf8)';
print qq[fü];

现在我得到66 c3 bc。但请删除use utf8,我得66 c3 83 c2 bc这对我没有任何意义。

使用UTF8制作我的代码DWIM是正确的做法吗?

PS我的语言环境设置为“en_US.UTF-8”和Perl 5.10.1。

2 个答案:

答案 0 :(得分:6)

use utf8;表示您的源代码是以UTF8编码的。添加

binmode *STDOUT, ':encoding(utf8)';
print qq[fü];

您要求脚本的输出也以UTF8编码。

如果你写过

print "f\x{00FC}\n";

您不需要use utf8;

答案 1 :(得分:0)

use utf8;只表示您的源代码(包括字符串文字)是UTF-8。您还需要设置输入和输入的编码。输出流。

您可能希望在环境中设置PERL_UNICODE变量。我把它设置为SAL,它会像这样分解:

  • S STDIN / STDOUT / STDERR为UTF-8
  • A @ARGV为UTF-8
  • L 但仅限于UTF-8区域设置

请参阅PERL_UNICODE中的the -C optionperlrun

您还可以使用the open pragma设置默认编码。

如果您在分发给其他人的模块中执行此操作,则可能需要

use open ':locale';

因此,对于不使用UTF-8语言环境的用户,不会意外启用UTF-8。