为什么Perl的Text :: Capitalize将“Juvénal”变成“JuvéNal”?

时间:2010-01-05 05:00:38

标签: perl utf-8 capitalization

我正在使用Text::Capitalize来尝试从网页中标记一些UTF-8编码的名称(使用WWW::Mechanize下载),但我没有得到我期望的结果。< / p>

例如,网页上的名称是“KAJELIJELI,Juvénal”,但capitalize_title返回“Kajelijeli,JuvéNal”(注意大写的N)。

我已尝试use utf8;并将$ word_rule正则表达式中的\w更改为[:word:]但未更改capitalize_title的输出。

有谁知道我怎么能让它发挥作用?

TIA

2 个答案:

答案 0 :(得分:3)

您一定忘记将输入的二进制模式设置为utf8,因为该模块工作正常。

示例:

#!perl
use warnings;
use strict;
use Text::Capitalize;
use utf8;
my $test = "KAJELIJELI, Juvénal";
binmode STDOUT, "utf8";
print capitalize_title ($test);

打印

Kajelijeli, Juvénal

答案 1 :(得分:3)

请注意:use utf8只是告诉Perl你在源代码中使用了Unicode(宽)字符。它没有做任何其他事情。但是,对于从其他地方获取的任何数据,您必须确保它是UTF-8编码的,并且您告诉任何输出目标它们应该期望UTF-8。

当您的UTF-8字符串出现问题时,有很多地方可能出错,因此请在前后开始检查以确保整个过程中的UTF-8。这可能意味着要弄清楚如何将您从网页上获得的Latin-1翻译成UTF-8。 EncodeEncode::FixLatin很有用。 Juerd's Perl Unicode Advice也很有帮助。

我的最新着作Effective Perl Programming, 2nd Edition,将这一问题用了整整一章。由于所有这些问题,写起来并不是一个特别有趣的章节,但是一旦你把所有的部分都弄好了,它就会更有意义。但是,它在3月份发布并不会对你有所帮助。 :(