gpt4 book ai didi

raku - 如何在 Perl 6 中删除变音符号

转载 作者:行者123 更新时间:2023-12-04 13:56:59 26 4
gpt4 key购买 nike

两个相关的问题。
Perl 6 非常聪明,它将字素理解为一个字符,无论是一个 Unicode 符号(如 äU+00E4 )还是两个或更多组合符号(如 ḏ̣ )。这个小代码

my @symb;
@symb.push("ä");
@symb.push("p" ~ 0x304.chr); # "p̄"
@symb.push("ḏ" ~ 0x323.chr); # "ḏ̣"
say "$_ has {$_.chars} character" for @symb;

给出以下输出:

ä has 1 character
p̄ has 1 character
ḏ̣ has 1 character

但有时我希望能够做到以下几点。
1) 从 ä 中删除变音符号.所以我需要一些方法,比如

"ä".mymethod → "a"

2) 将“组合”符号拆分为多个部分,即拆分 进入 pCombining Macron U+0304 .例如。类似以下内容 bash :

$ echo p̄ | grep . -o | wc -l
2

最佳答案

这是我从文档中想到的最好的方法——可能有更简单的方法,但我不确定。

my $in = "Él está un pingüino";
my $stripped = Uni.new($in.NFD.grep: { !uniprop($_, 'Grapheme_Extend') }).Str;
say $stripped; # El esta un pinguino
.NFD方法将字符串转换为规范化形式 D(分解),它将字形分离为基本代码点并尽可能组合代码点。然后,grep 仅返回没有“Grapheme_Extend”属性的那些代码点的列表,即它删除组合代码点。 Uni.new(...).Str然后将这些代码点组装回一个字符串。

您也可以将这些部分放在一起来回答您的第二个问题;例如。:
$in.NFD.map: { Uni.new($_).Str }

将返回一个由 1 个字符组成的字符串列表,每个字符串都有一个分解的代码点,或者
$in.NFD.map(&uniname).join("\n")

将成为一个不错的小 unicode 调试器。

关于raku - 如何在 Perl 6 中删除变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798994/

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