两个相关的问题。
Perl 6 非常聪明,它将字素理解为一个字符,无论是一个 Unicode 符号(如 ä
、 U+00E4
)还是两个或更多组合符号(如 p̄
和 ḏ̣
)。这个小代码
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) 将“组合”符号拆分为多个部分,即拆分
p̄
进入 p
和 Combining 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/