我有字符串"re\x{0301}sume\x{0301}"
(打印如下:résumé),我想将其反转为"e\x{0301}muse\x{0301}r"
(émusér)。我不能使用Perl的reverse
,因为它会将像"\x{0301}"
这样的组合字符视为单独的字符,因此我最终得到了"\x{0301}emus\x{0301}er"
(``emuśer'')。如何反转字符串,但仍然尊重组合字符?
最佳答案
最好的答案是使用Unicode::GCString,as Sinan points out
我修改了Chas的示例:
在STDOUT上设置编码,以避免出现“宽字符打印”警告;
在split
中使用正向超前断言(并且不使用分隔符保留模式)(显然在5.10之后不起作用,因此我将其删除了)
进行一些调整基本上是相同的。
use strict;
use warnings;
binmode STDOUT, ":utf8";
my $original = "re\x{0301}sume\x{0301}";
my $wrong = reverse $original;
my $right = join '', reverse split /(\X)/, $original;
print <<HERE;
original: [$original]
wrong: [$wrong]
right: [$right]
HERE