两个相关的问题.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;
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
ä has 1 character
p? has 1 character
?? has 1 character
Run Code Online (Sandbox Code Playgroud)
但有时我希望能够做到以下几点.1)从中删除变音符号ä.所以我需要一些方法
"ä".mymethod ? "a"
Run Code Online (Sandbox Code Playgroud)
2)将"组合"符号拆分成部分,即拆分p?成p和Combining Macron U+0304.例如以下内容bash:
$ echo p? | grep . -o | wc -l
2
Run Code Online (Sandbox Code Playgroud)
Perl 6 在Str类中具有强大的 Unicode 处理支持。要执行您在 (1) 中要求的操作,您可以使用该samemark方法/例程。
根据文档:
\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n\nmulti sub samemark(Str:D $string, Str:D $pattern --> Str:D)\nmethod samemark(Str:D: Str:D $pattern --> Str:D)\n返回 的副本,
\n\n$string其中每个字符的标记/重音信息已更改,以便它与 中相应字符的标记/重音相匹配$pattern。如果$string长于$pattern,则 中的其余字符将$string接收与 中最后一个字符相同的标记/重音$pattern。如果$pattern为空,则不会进行任何更改。例子:
\n\nRun Code Online (Sandbox Code Playgroud)\nsay \'\xc3\xa5\xc3\xa4\xc3\xb6\'.samemark(\'a\xc3\xa4o\'); # OUTPUT: \xc2\xaba\xc3\xa4o\xe2\x90\xa4\xc2\xbb \nsay \'\xc3\xa5\xc3\xa4\xc3\xb6\'.samemark(\'a\'); # OUTPUT: \xc2\xabaao\xe2\x90\xa4\xc2\xbb \n\nsay samemark(\'P\xc3\xaarl\', \'a\'); # OUTPUT: \xc2\xabPerl\xe2\x90\xa4\xc2\xbb \nsay samemark(\'a\xc3\xb6\xc3\xa4\', \'\'); # OUTPUT: \xc2\xaba\xc3\xb6\xc3\xa4\xe2\x90\xa4\xc2\xbb \n
这既可以用于从字母中删除标记/变音符号,也可以用于添加它们。
\n\n对于(2),有几种方法可以做到这一点(TIMTOWTDI)。如果您想要字符串中所有代码点的列表,可以使用该ords方法来获取字符串中所有代码点的a List(技术上是 a )。Positional
say "p\xcc\x84".ords; # OUTPUT: \xc2\xab(112 772)\xe2\x90\xa4\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n\n您可以使用uniname方法/例程来获取代码点的 Unicode 名称:
.uniname.say for "p\xcc\x84".ords; # OUTPUT: \xc2\xabLATIN SMALL LETTER P\xe2\x90\xa4COMBINING MACRON\xe2\x90\xa4\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n\n或者只是使用uninames方法/例程:
.say for "p\xcc\x84".uninames; # OUTPUT: \xc2\xabLATIN SMALL LETTER P\xe2\x90\xa4COMBINING MACRON\xe2\x90\xa4\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n\n如果您只想要字符串中的代码点数量,可以使用codes:
say "p\xcc\x84".codes; # OUTPUT: \xc2\xab2\xe2\x90\xa4\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n\n这与 不同chars,后者仅计算字符串中的字符数:
say "p\xcc\x84".chars; # OUTPUT: \xc2\xab1\xe2\x90\xa4\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n\n另请参阅@hobbs' 使用 的回答NFD。
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |