我有字符串"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::GCStringas 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

10-05 20:01