【问题标题】:How to do "decode 'unicode-escape'" only on \xhh characters in a string in Perl?如何仅对 Perl 字符串中的 \xhh 字符进行“解码 'unicode-escape'”?
【发布时间】:2011-06-11 11:22:05
【问题描述】:

我有一个包含以下内容的文件,其中一些字符在字符串文字中以 UTF-8 十六进制编码:

<root>
<element type=\"1\">\"Hello W\xC3\x96rld\"</element>
</root>

我想读取文件并将文件中的 UTF-8 十六进制编码字符解码为它们所代表的实际 unicode 字符,然后写入新文件。鉴于以上内容,当您在 UTF-8 编码的文本编辑器中打开新文件时,新文件应如下所示:

<root>
<element type=\"1\">\"Hello WÖrld\"</element>
</root>

注意双引号仍然被转义,UTF-8 十六进制编码的\xC3\x96 现在变成了 Ö(U+00D6 拉丁大写字母 O 带分音符号)。

我有部分工作的代码,如下:

#! /usr/bin/perl -w

use strict;
use Encode::Escape;

while (<>)
{
    # STDOUT is redirected to a new file.
    print decode 'unicode-escape', $_;
}

但问题是,\" 等所有其他转义序列也被 decode 'unicode-escape', $_ 解码。所以最后,我得到以下信息:

<root>
<element type="1">"Hello WÖrld"</element>
</root>

我已尝试以 UTF-8 编码和/或使用 Unicode::Escape::unescape 读取文件,例如

open(my $UNICODESFILE, "<:encoding(UTF-8)", shift(@ARGV));
Unicode::Escape::unescape($line);

但它们都没有解码 \xhh 转义序列。

基本上我想要的只是decode 'unicode-escape', $_ 的行为,但它应该只在\xhh 转义序列上解码并忽略其他转义序列。

这可能吗?使用 decode 'unicode-escape', $_ 是否适合这种情况?还有什么办法吗?谢谢!

【问题讨论】:

  • 你为什么要这样做?我很欣赏您正在尝试做的事情,但我想知道这是否不是 X/Y 问题以及您是否因为其他原因而尝试以这种方式做事。

标签: perl encoding utf-8 decoding unicode-escapes


【解决方案1】:

我猜是查找 \xNN 字符组并处理它们:

s{((?:\\x[0-9A-Fa-f]{2})+)}{decode 'unicode-escape', $1}ge

【讨论】:

  • 也不是 1 字节编码,我认为这是实际匹配的。我已经更新了它。对不起我没有先测试。
猜你喜欢
  • 2017-07-14
  • 2011-11-26
  • 1970-01-01
  • 2017-08-04
  • 2014-12-03
  • 2014-04-16
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多