1

次の内容のファイルがあり、一部の文字は文字列リテラルでエンコードされた 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', $_適切ですか? その他の方法で?ありがとう!

4

1 に答える 1

1

\xNN 文字のグループを見つけて処理します。

s{((?:\\x[0-9A-Fa-f]{2})+)}{decode 'unicode-escape', $1}ge
于 2011-01-19T01:10:00.897 に答える