perl – Unicode-ready wordsearch – 问题
发布时间:2020-12-16 06:14:53 所属栏目:大数据 来源:网络整理
导读:这段代码好吗?我真的不知道我应该使用哪种规范化形式(我唯一注意到的是NFD我输错了). #!/usr/local/bin/perluse warnings;use 5.014;use utf8;binmode STDOUT,':encoding(utf-8)';use Unicode::Normalize;use Unicode::Collate::Locale;use Unicode::GCStri
|
这段代码好吗?我真的不知道我应该使用哪种规范化形式(我唯一注意到的是NFD我输错了).
#!/usr/local/bin/perl
use warnings;
use 5.014;
use utf8;
binmode STDOUT,':encoding(utf-8)';
use Unicode::Normalize;
use Unicode::Collate::Locale;
use Unicode::GCString;
my $text = "my taxt t?xt";
my %hash;
while ( $text =~ m/(p{Alphabetic}+(?:'p{Alphabetic}+)?)/g ) { #'
my $word = $1;
my $NFC_word = NFC( $word );
$hash{$NFC_word}++;
}
my $collator = Unicode::Collate::Locale->new( locale => 'DE' );
for my $word ( $collator->sort( keys %hash ) ) {
my $gcword = Unicode::GCString->new( $word );
printf "%-10.10s : %5dn",$gcword,$hash{$word};
}
解决方法
哇!!我无法相信没有人回答这个问题.这是一个非常好的问题.你几乎也是对的.我喜欢你使用Unicode :: Collat??e :: Locale和Unicode :: GCString.对你有益!
您输出“错误”输出的原因是因为您没有使用Unicode :: GCString类的列方法来确定要打印的内容的打印宽度. printf是非常愚蠢的,只计算代码点,而不是列,所以你必须编写自己的pad函数,将GCS列考虑在内.例如,要手动完成,而不是写这个: printf "%-10.10s",$gstring; 你必须这样写: $colwidth = $gcstring->columns();
if ($colwidth > 10) {
print $gcstring->substr(0,10);
} else {
print " " x (10 - $colwidth);
print $gcstring;
}
看看它是如何工作的? 现在规范化并不重要.忽略Kerrek的旧评论.这是非常错误的. UCA专门设计为不让规范化进入此事.你必须向后弯曲到螺旋而不是向上,比如通过标准化=>如果你想使用它的gmatch方法或者其他类似的东西,请在构造函数中使用undef. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
