我对这个测试脚本感到困惑:
#!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
基于正则表达式的regexp 升级为utf8字符串,从而通过测试.
如果我删除了use encoding
测试按预期传递的行,但我无法弄清楚为什么它们会在utf8
模式下失败.
我在Mac OS X上使用perl 5.8.8(系统版).
不要使用encoding
pragma.它坏了.(Juerd Waalboer在YAPC :: EU 2k8上提到了这个问题.)
它至少有两件不属于一起的东西:
它指定源文件的编码.
它指定文件输入/输出的编码.
并且为了侮辱伤害它也会以一种破碎的方式排在第一位:它将\xNN
序列重新解释为未编码的八位位组,而不是将它们视为代码点,并对它们进行解码,从而阻止您在指定的编码之外表达字符并制作根据编码,您的源代码意味着不同的东西.这只是一个惊人的错误.
仅以ASCII或UTF-8编写源代码.在后一种情况下,该utf8
编译就是用正确的事情.如果您不想使用UTF-8,但确实想要包含非ASCII字符,请显式转义或解码它们.
并明确使用I/O层或使用设置它们的open
编译有I/O自动转码正确.