Как сделать "декодировать 'Unicode-escape'" только для символов \ xhh в строке в Perl? - PullRequest
1 голос
/ 19 января 2011

У меня есть файл со следующим содержимым, некоторые символы которого имеют шестнадцатеричный код 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 LATIN CAPITAL LETTER O WITH DIAERESIS).

У меня есть частично работающий код, как показано ниже:

#! /usr/bin/perl -w

use strict;
use Encode::Escape;

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

Проблема, однако,все другие 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);

, но нииз них декодируют escape-последовательности \xhh.

По сути, все, что мне нужно, это поведение decode 'unicode-escape', $_, но он должен декодировать только на \xhh escape-последовательности и игнорировать другие escape-последовательности.

Возможно ли это?Подходит ли для этого случая decode 'unicode-escape', $_?Любым другим путем?Спасибо!

1 Ответ

1 голос
/ 19 января 2011

Найти группы символов \ xNN и обработать их, я думаю:

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