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

标签 raku

两个相关的问题。
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/

相关文章:

使用 fcntl 从 stdout 创建新文件描述符在文件中失败

metaprogramming - 您如何从它们所属的类型之外访问私有(private)方法或属性?

hash - 如何获得no的计数。 perl 6 %HASH 中的键数?

raku - 确定是否设置了 Raku 中的变量

regex - 在 Raku 中,如何从字符串动态创建代码对象?

raku - 子程序 'say' 未在 CommaIde 上声明

operators - 是否可以在 Raku 中定义一个新的运算符并控制其优先级?

raku - Perl 6 性能是否因使用十进制数的有理数而受到影响

perl - 如何使用 Perl 6 运行外部程序? (例如 Perl 5 中的 "system")

raku - Perl6 : Match elements in a list with another list