2011-01-19 64 views
1

我有以下內容的一些字符的文件是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

回答

1

的\ XNN字符查找組和處理它們,我想:

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

不,那是不對的。 UTF-8不是2字節編碼。 – tchrist 2011-01-19 01:57:28

相關問題