gpt4 book ai didi

perl - Unicode 就绪字搜索 - 问题

转载 作者:行者123 更新时间:2023-12-02 22:47:23 26 4
gpt4 key购买 nike

这段代码可以吗?我真的不知道我应该使用哪种规范化形式(我注意到的唯一一件事是使用 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 : %5d\n", $gcword, $hash{$word};
}

最佳答案

哇!!我不敢相信没有人回答这个问题。这是一个 super 棒的问题。你也几乎说对了。我喜欢你使用 Unicode::Collat​​e::Locale 和 Unicode::GCString。对你有好处!

您得到“错误”输出的原因是您没有使用 Unicode::GCString 类的 columns 方法来确定您正在打印的内容的打印宽度。

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 是专门设计的,不让正常化影响到问题。您必须竭尽全力地搞砸而不是搞砸,例如将 normalization => undef 传递给构造函数,以防您想使用它的 gmatch 方法或类似方法。

关于perl - Unicode 就绪字搜索 - 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com