【问题标题】:Why do my Perl tests fail with use encoding 'utf8'?为什么我的 Perl 测试因使用编码“utf8”而失败?
【发布时间】:2010-10-04 07:38:02
【问题描述】:

我对这个测试脚本感到困惑:

#!perl

use strict;
use warnings;
use encoding 'utf8';
use Test::More 'no_plan';

ok('áá' =~ m/á/, 'ok direct match');

my $re = qr{á};
ok('áá' =~ m/$re/, 'ok qr-based match');

like('áá', $re, 'like qr-based match');

三个测试都失败了,但我期待 use encoding 'utf8' 会将文字 áá 和基于 qr 的正则表达式升级为 utf8 字符串,从而通过测试。

如果我删除 use encoding 行,测试会按预期通过,但我无法弄清楚为什么它们会在 utf8 模式下失败。

我在 Mac OS X(系统版本)上使用 perl 5.8.8。

【问题讨论】:

    标签: perl testing utf-8


    【解决方案1】:

    不要使用encoding pragma。它坏了。 (Juerd Waalboer 做了一场精彩的演讲,他在 YAPC::EU 2k8 中提到了这一点。)

    它至少同时做两件不属于一起的事情:

    1. 它指定源文件的编码。
    2. 它指定文件输入/输出的编码。

    为了增加侮辱性,它还以一种破碎的方式执行 #1:它将\xNN 序列重新解释为未解码的八位位组,而不是将它们视为代码点,并对其进行解码,从而阻止您在外部表达字符您指定的编码并使您的源代码具有不同的含义,具体取决于编码。这真是大错特错。

    仅使用 ASCII 或 UTF-8 编写您的源代码。在后一种情况下,utf8 pragma 是正确的使用方式。如果您不想使用 UTF-8,但确实想包含非 ASCII 字符,请显式转义或解码它们。

    并明确使用 I/O 层或使用 open pragma 设置它们以使 I/O 自动正确转码。

    【讨论】:

    • 过去我总是使用use utf8,而在去年左右的某个时候,我看到某处use utf8 坏了,我应该使用use encoding 'utf8'。看来我需要重新审视整个问题......谢谢
    【解决方案2】:

    它在我的电脑上运行良好(在 perl 5.10 上)。也许您应该尝试将 use encoding 'utf8' 替换为 use utf8

    你使用的是什么版本的 perl?我认为旧版本在正则表达式中存在 UTF-8 的错误。

    【讨论】:

    • 我还将use encoding 'utf8' 更改为use utf8,它在 5.8.8 Linux 上对我有用
    【解决方案3】:

    Test::More documentation 包含针对此问题的修复程序,我今天刚刚发现(并且此条目在 google 中显示得更高)。

    utf8 / "打印中的宽字符"

    如果您在 Test::More 中使用 utf8 或其他非 ASCII 字符,您可能会收到“打印中的宽字符”警告。使用 binmode STDOUT,":utf8" 不会修复它。 Test::Builder(为 Test::More 提供支持)复制 STDOUT 和 STDERR。因此,对它们的任何更改,包括更改它们的输出规则,都不会被 Test::More 显示出来。解决方法是直接更改 Test::Builder 使用的文件句柄。

    my $builder = Test::More->builder;
    binmode $builder->output,         ":utf8";
    binmode $builder->failure_output, ":utf8";
    binmode $builder->todo_output,    ":utf8";
    

    我在我的测试代码中添加了一些样板文件,它很有魅力。

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 2013-06-25
      • 2020-03-23
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多