如何反转 Perl 中包含组合字符的字符串?
我有字符串 "re\x{0301}sume\x{0301}"
(打印如下:简历),我想将其反转为 "e\x{0301} muse\x{0301}r"
(émusér)。我无法使用 Perl 的 reverse
因为它处理组合像 "\x{0301}"
这样的字符作为单独的字符,所以我最终得到 "\x{0301}emus\x{0301}er"
( ́emuśer)。如何反转字符串,但仍然尊重组合字符?
I have the string "re\x{0301}sume\x{0301}"
(which prints like this: résumé) and I want to reverse it to "e\x{0301}muse\x{0301}r"
(émusér). I can't use Perl's reverse
because it treats combining characters like "\x{0301}"
as separate characters, so I wind up getting "\x{0301}emus\x{0301}er"
( ́emuśer). How can I reverse the string, but still respect the combining characters?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 \X 特殊转义 (匹配非组合字符和所有以下组合字符)与
split
创建一个字素列表(它们之间有空字符串),反转字素列表,然后
加入
将它们重新组合在一起:You can use the \X special escape (match a non-combining character and all of the following combining characters) with
split
to make a list of graphemes (with empty strings between them), reverse the list of graphemes, thenjoin
them back together:最好的答案是使用 Unicode::GCString, 正如Sinan指出的,
我稍微修改了Chas的示例:
split
中使用正向先行断言(并且没有分隔符保留模式)(显然在 5.10 之后不起作用,所以我删除了它)这基本上是相同的事情,只是做了一些调整。
The best answer is to use Unicode::GCString, as Sinan points out
I modified Chas's example a bit:
split
(doesn't work after 5.10, apparently, so I removed it)It's basically the same thing with a couple of tweaks.
您可以使用 Unicode::GCString:
输出:
You can use Unicode::GCString:
Output:
Perl6::Str
->reverse
也可以。对于字符串
résumé
,您还可以使用Unicode::Normalize
核心模块将字符串更改为完全组合的形式(NFC
或NFKC
) 在反向
之前;然而,这不是一个通用的解决方案,因为一些基本字符和修饰符的组合没有预组合的 Unicode 代码点。Perl6::Str
->reverse
also works.In the case of the string
résumé
, you can also use theUnicode::Normalize
core module to change the string to a fully composed form (NFC
orNFKC
) beforereverse
ing; however, this is not a general solution, because some combinations of base character and modifier have no precomposed Unicode codepoint.其他一些答案包含效果不佳的元素。这是在 Perl 5.12 和 5.14 上测试的工作示例。未能指定 binmode 将导致输出生成错误消息。在 split 中使用正向先行断言(并且无分隔符保留模式)将导致我的 Macbook 上的输出不正确。
Some of the other answers contain elements that don't work well. Here is a working example tested on Perl 5.12 and 5.14. Failing to specify the binmode will cause the output to generate error messages. Using a positive lookahead assertion (and no separator retention mode) in split will cause the output to be incorrect on my Macbook.