次の内容のファイルがあり、一部の文字は文字列リテラルでエンコードされた UTF-8 16 進数です。
<root>
<element type=\"1\">\"Hello W\xC3\x96rld\"</element>
</root>
ファイルを読み取り、ファイル内の UTF-8 16 進数でエンコードされた文字を実際の Unicode 文字にデコードしてから、新しいファイルに書き込みたいと考えています。上記の内容の場合、UTF-8 エンコーディングのテキスト エディターで開くと、新しいファイルは次のようになります。
<root>
<element type=\"1\">\"Hello WÖrld\"</element>
</root>
二重引用符がまだエスケープされており、UTF-8 16 進エンコード\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', $_;
}
ただし、問題は、 などの他のすべてのエスケープ シーケンス\"
も によってデコードされます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', $_
適切ですか? その他の方法で?ありがとう!