如何在Perl中将文字字符串转换为其表示的unicode?

时间:2017-11-02 19:14:35

标签: perl unicode string-literals

如果我有像

这样的文字字符串
my $x = 'JPMorgan Chase \x{0026} Co';

我想将其转换为

"JPMorgan Chase \x{0026} Co" 

其中包含一个unicode。 (请注意双引号和单引号之间的区别。)

最简单的方法是什么?这是一个简化的例子。实际问题有很多这样的例子。

2 个答案:

答案 0 :(得分:4)

如果你需要处理的唯一转义格式是\x{1234},那么处理它的一种方法可能是将转义序列与正则表达式匹配,然后使用chr(hex($1))将十六进制字符串转换为一个角色:

my $x = 'JPMorgan Chase \x{0026} Co';
$x =~ s/\\x\{([0-9a-f]+)\}/chr(hex($1))/e;
say $x; # -> "JPMorgan Chase & Co"

答案 1 :(得分:2)

而duskwuff&暴徒做得很好,回答你的直接问题。 (FWIW:暴徒的$x = eval qq{"$x"}具有不可否认的优雅。)真正的问题是为什么除了插值字符串之外你有Perl字符转义?如果您从源代码(IO)的某个其他获取此字符串,并且原始unicode编码不合适,请考虑一个更常见的编码,Perl可以使用这些编码:

  • URI编码:%26
  • XML编码:&#x26
  • JSON编码:\u0026

......还有很多其他人。这样的编码将使您的IPC和数据文件与其他系统更加可互操作。

...当然,如果你的Perl源中的这些东西 ,只需将它们放在双引号中,让编译器阶段插入它们。