我有字符串"re\x{0301}sume\x{0301}"
(打印如下:re musé́),我想将其反转为"e\x{0301}muse\x{0301}r"
(émusér)。我不能使用Perl的reverse
,因为它将像"\x{0301}"
这样的组合字符视为单独的字符,所以我最终得到了"\x{0301}emus\x{0301}er"
(́emuśer)。如何才能在反转字符串的同时仍然遵守组合字符?
发布于 2009-08-28 19:10:04
最好的答案是使用Unicode::GCString、as Sinan points out
我稍微修改了一下查斯的例子:
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
发布于 2009-08-28 14:47:53
您可以将\X special escape (匹配非组合字符和以下所有组合字符)与split
一起使用,以创建字素列表(其间有空字符串),反转字素列表,然后将它们重新组合在一起:
#!/usr/bin/perl
use strict;
use warnings;
my $original = "re\x{0301}sume\x{0301}";
my $wrong = reverse $original;
my $right = join '', reverse split /(\X)/, $original;
print "original: $original\n",
"wrong: $wrong\n",
"right: $right\n";
发布于 2019-10-09 15:53:14
Perl6::Str->reverse
也是有效的。
对于字符串résumé
,您还可以使用Unicode::Normalize
核心模块在Unicode之前将字符串更改为完全合成的形式(NFC
或NFKC
);但是,这不是一般的解决方案,因为基字符和修饰符的某些组合没有预先合成的reverse
代码点。
https://stackoverflow.com/questions/1347478
复制相似问题