【问题标题】:Why dosn't "use utf-8;" work when used inside a Perl module?为什么不“使用 utf-8;”在 Perl 模块中使用时工作?
【发布时间】:2019-04-04 20:31:35
【问题描述】:

我们的库中有一个错误,这是由其中一个输入为 Unicode 引起的。

已通过使用该库将 use utf8; 添加到脚本中来解决此问题。

但是,将use utf8; 添加到库本身(因此使用该库的所有脚本都将被修复)没有效果。

为什么?这可以解决吗?

【问题讨论】:

  • 告诉 perl 是否是 unicode 是你的工作
  • 简短的回答是use utf-8 没有做你认为它做的事情。网站上有各种关于如何在 perl 中正确处理 utf8 的答案。

标签: perl utf-8


【解决方案1】:

来自the documentation

use utf8 pragma 告诉 Perl 解析器在当前词法范围内的程序文本中允许 UTF-8。

换句话说,此编译指示仅适用于当前包。您需要将它放在源代码可能包含 Unicode 字符的每个包中。如果您的输入来自其他地方,那么您需要确保它被正确解码:pragma 对此没有影响。

PS:我知道您的意思是use utf8,而不是use utf-8(后者不是有效的编译指示)。

【讨论】:

  • 更具体地说,它只适用于源代码,所以它需要进入带有UTF-8源代码的文件。如果您的输入来自其他地方,例如文件、STDIN、数据库,那么您需要确保以适合该介质的方式对其进行正确解码; use utf8 对此没有影响。
  • @Grinnz:是的,值得一提的是,我相应地更新了我的答案。谢谢!
  • 谢谢。具有讽刺意味的是,我的主要问题是我们的最小测试实际上是在测试错误的东西(通过硬编码 utf 测试字符串作为脚本的一部分),这个答案解释了问题是什么并且我们最初的解决方案确实解决了错误的问题(我们需要使用打开并改为 perl 5.12 升级)
【解决方案2】:

use utf8; 告诉 Perl 当前文件是使用 UTF-8 编码的。

您有一个使用 UTF-8 编码的脚本,因此您必须在脚本中添加 use utf8;。 (没有它,你可能认为你有 my $x = "é";,但你告诉 Perl my $x = "é";。)

如果它是使用 UTF-8 编码的脚本,那么将它添加到模块是没有意义的。该指令必须添加到使用 UTF-8 编码的每个文件(脚本或模块)中。 (如果你将错误的$x 传递给一个模块,并且模块因此产生垃圾,它仍然是需要修复的脚本。)

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 2015-08-02
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2015-11-22
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多