首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Perl中反转包含组合字符的字符串?

如何在Perl中反转包含组合字符的字符串?
EN

Stack Overflow用户
提问于 2009-08-28 14:47:37
回答 4查看 984关注 0票数 13

我有字符串"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)。如何才能在反转字符串的同时仍然遵守组合字符?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-28 19:10:04

最好的答案是使用Unicode::GCStringas Sinan points out

我稍微修改了一下查斯的例子:

  • 设置了STDOUT上的编码,以避免"wide character in print“的警告;
  • split ( 5.10以后不起作用,很明显,所以我删除了它)

中使用了肯定的先行断言(并且没有分隔符保留模式)。

这基本上是相同的事情,只是做了几次调整。

代码语言:javascript
运行
复制
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
票数 8
EN

Stack Overflow用户

发布于 2009-08-28 14:47:53

您可以将\X special escape (匹配非组合字符和以下所有组合字符)与split一起使用,以创建字素列表(其间有空字符串),反转字素列表,然后将它们重新组合在一起:

代码语言:javascript
运行
复制
#!/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";
票数 12
EN

Stack Overflow用户

发布于 2019-10-09 15:53:14

Perl6::Str->reverse也是有效的。

对于字符串résumé,您还可以使用Unicode::Normalize核心模块在Unicode之前将字符串更改为完全合成的形式(NFCNFKC);但是,这不是一般的解决方案,因为基字符和修饰符的某些组合没有预先合成的reverse代码点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1347478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档