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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |