大写包含重音字符的字符串

Bri*_*ley 6 regex unicode perl capitalization

我正在尝试找到一个在perl webapp中大写名称的解决方案(使用perl v5.10.1).我原本以为使用Lingua :: EN :: NameCase,但我看到了重音字符的一些问题.

我需要能够处理来自各种欧洲语言(爱尔兰语,法语,德语)的重音字符.

我在网上看到一些迹象表明Lingua :: EN :: NameCase应该适用于我的用例.例如,perlmonks上的这个页面:http://www.perlmonks.org/?node_id = 889135

这是我基于以上链接的测试代码:

#!/usr/bin/perl

use strict;
use warnings;
use Lingua::EN::NameCase;
use locale;
use POSIX qw(locale_h);

my $locale = 'en_FR.utf8';

setlocale( LC_CTYPE, $locale );

binmode DATA,   ':encoding(UTF-8)';
binmode STDOUT, ':encoding(UTF-8)';

while (my $original_name = <DATA>) {
    chomp $original_name;
    my $normalized_name = nc($original_name);
    printf "%30s L::EN::NC %30s UCFIRST %30s\n", $original_name, $normalized_name, xlc($original_name);
}

sub xlc {
    my $str = shift;
    $_ = lc( $str );
    return join q{} => ( map { ucfirst(lc($_)) } ( $str =~ m/(\W+|\w+)/g ) );
};

__DATA__
ÉTIENNE DE LA BOÉTIE
ÉMILIE DU CHÂTELET
HÉLÈNE CIXOUS
Seán Ó Hannracháín
Máire Ó hÓgartaigh
Run Code Online (Sandbox Code Playgroud)

产生下面的输出.L :: EN :: NC和自定义ucfirst(lc())解决方案都会产生不正确的结果(请注意每个重音字符后面的大写字母).这似乎是因为perl正则表达式在每个重音字符之前/之后匹配"单词边界".我希望单词边界只能匹配空格字符和非空格字符.

有人可以提出解决方案吗?

谢谢,

布莱恩.

  ÉTIENNE DE LA BOÉTIE L::EN::NC           éTienne de la BoéTie UCFIRST           ÉTienne De La BoÉTie
    ÉMILIE DU CHÂTELET L::EN::NC             éMilie du ChâTelet UCFIRST             ÉMilie Du ChÂTelet
         HÉLÈNE CIXOUS L::EN::NC                  HéLèNe Cixous UCFIRST                  HÉLÈNe Cixous
    Seán Ó Hannracháín L::EN::NC             SeáN ó HannracháíN UCFIRST             SeÁN ó HannrachÁíN
    Máire Ó hÓgartaigh L::EN::NC             MáIre ó HóGartaigh UCFIRST             MÁIre ó HÓGartaigh
Run Code Online (Sandbox Code Playgroud)

Boh*_*dan 0

如果您的数据是 UTF8,您应该将其解码为 perl 的内部编码:

    utf8::decode($original_name);
    my $normalized_name = nc($original_name);
    printf "%30s L::EN::NC %30s UCFIRST %30s\n", $original_name, $normalized_name, xlc($original_name);
Run Code Online (Sandbox Code Playgroud)