У меня есть файл со следующим содержимым, некоторые символы которого имеют шестнадцатеричный код 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', $_
?Любым другим путем?Спасибо!