【问题标题】:How to convert a literal string to its represented unicode in Perl?如何在 Perl 中将文字字符串转换为其表示的 unicode?
【发布时间】:2017-11-02 19:14:35
【问题描述】:

如果我有一个像

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

我想把它转换成

"JPMorgan Chase \x{0026} Co" 

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

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

【问题讨论】:

标签: perl unicode string-literals


【解决方案1】:

如果您需要处理的唯一转义格式是\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"

【讨论】:

  • 这也有效。以前不知道 /e 标志。谢谢。
  • 至少也可能需要处理\\
  • @ikegami 我的意思是,取决于输入的实际内容。问题只提到了\x{1234} 语法,所以……
  • 没错。这个问题可能(甚至肯定)遗漏了一些东西,因此答案也是如此,所以应该小心。
【解决方案2】:

虽然黄昏和暴民在回答您的直接问题方面做得很好。 (FWIW:mob 的$x = eval qq{"$x"} 具有不可否认的优雅。)真正的问题是为什么 Perl 字符会在除插值字符串之外的其他地方转义?如果您从源代码 (IO) 以外的某个地方获取此字符串,并且原始 unicode 编码不合适,请考虑使用 Perl 提供现成模块的更常见的编码:

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

...还有很多其他的。此类编码将使您的 IPC 和数据文件与其他系统的互操作性更高。

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

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多