#!/usr/local/bin/perluse 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 = ; 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 : %5d\n",$gcword,$hash{$word};}解决方法 哇!!我无法相信没有人回答这个问题.这是一个非常好的问题.你几乎也是对的.我喜欢你使用Unicode :: Collate :: 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.
总结以上是内存溢出为你收集整理的perl – Unicode-ready wordsearch – 问题全部内容,希望文章能够帮你解决perl – Unicode-ready wordsearch – 问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)