【问题标题】:How do I make Perl code DWIM with UTF8?如何使用 UTF8 制作 Perl 代码 DWIM?
【发布时间】:2010-02-17 11:51:31
【问题描述】:

文件句柄上的 utf8 pragma 和 utf8 编码让我感到困惑。例如,这个看似简单的代码......

use utf8;
print qq[fü];

需要明确的是,“fü”上的十六进制转储是 66 c3 bc,如果我没记错的话是正确的 UTF8。

打印出66 fc,它不是UTF8,而是Unicode,或者可能是Latin-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。

【问题讨论】:

  • 查看最新版Effective Perl Programming中的Unicode章节。它在 Safari Online 的粗剪中 :)
  • 迟到了,但我真的建议任何想要快速掌握 Perl 字符编码的人阅读 Juerd 的“perlunitut”和“perlunifaq”perldocs。它们是相当新的(在 5.10.0 和 5.8.9 中添加)所以“阅读每个 perldoc”的老手可能不知道它们在那里 :)

标签: perl utf-8


【解决方案1】:

use utf8; 声明您的源代码以 UTF8 编码。通过添加

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

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

如果你写过

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

你不需要use utf8;

【讨论】:

  • 为了安全起见,我必须在代码和我可能写入的每个文件句柄中都打开 utf8?有什么方法可以神奇地实现这一点?
  • use open ":encoding(utf8)"; use open ":std"; 似乎是必要的魔法。
  • Sinan 写道:你必须打开 utf8 来告诉 Perl 你的源代码使用的是 UTF-8。如果您的文件包含 UTF-8,您必须对写入写入文件句柄的文本进行编码,并对从读取文件句柄读取的文本进行解码。
  • 如果您在其他人的系统上运行,您可能需要use open ':locale';,以便您尊重他们的设置。他们可能不想要 UTF-8。 (注意:locale 暗示:std。)
【解决方案2】:

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

您可能希望在您的环境中设置PERL_UNICODE 变量。我将它设置为SAL,分解如下:

  • S STDIN/STDOUT/STDERR 是 UTF-8
  • A @ARGV 是 UTF-8
  • L,但仅限于 UTF-8 语言环境

参见perlrun 中的PERL_UNICODEthe -C option

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

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

use open ':locale';

因此它不会为不使用 UTF-8 语言环境的人意外打开 UTF-8。

【讨论】:

  • 谢谢。我会使用它,但我必须将其作为模块的一部分。这在启动时似乎是必要的。
猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2012-10-20
  • 2018-08-06
相关资源
最近更新 更多