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

问题描述:

我有以下内容的一些字符的文件是UTF-8十六进制的字符串字面量在编码:如何在Perl中对字符串中的 xhh字符进行“解码”unicode-escape'“?

<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拉丁文DIALISES字母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', $_适合这种情况?任何其他方式?谢谢!

+0

你为什么要这么做?我很欣赏你想要做的事情,但我想知道这是不是X/Y问题,以及是否因为其他事情而试图以这种方式做事。 – mfontani 2011-01-19 14:00:38

的\ XNN字符查找组和处理它们,我想:

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

不,那是不对的。 UTF-8不是2字节编码。 – tchrist 2011-01-19 01:57:28