加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读