如何只对Perl中字符串中的\ xhh字符执行“解码'unicode-escape'”?

时间:2011-01-19 01:05:41

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

我有一个包含以下内容的文件,其中一些字符是字符串文字中的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带有DIAERESIS的LATIN CAPITAL LETTER 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', $_是否合适?还有其他方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

查找\ xNN字符组并处理它们,我想:

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