3

誰かが私がこれで間違っている方向に私を向けることができることを願っています:

(私が信じている) 16 進エンコードされた UCS2 の文字列がありますが、プロバイダーはそれが UCS2-LE か UCS2-BE かを教えてくれません。

そのように: 0627062E062A062806270631

これは次のように翻訳されます。

アラビア語ではどうやら...しかし、それを16進数から変換しようとしても、それをまっすぐなUCS2(LEまたはBE)として使用しても、実際に太陽の下で考えることができる他のものとして使用しても、ネイティブに変換することはできません- perl UTF-8 を使用して、標準の UTF-8 (システムのネイティブ形式) として再エンコードできるようにします。

コード:

my $string = "0627062E062A062806270631";
my $decodedHex = hex($string);

#NEAREST
my $perlDecodedUTF8 = decode("UCS-2BE", $decodedHex);
my $utf8 = encode('UTF-8',$perlDecodedUTF8);

open(ARABICTEST,">ucs2test.txt");
print(ARABICTEST $perlDecodedUTF8);
print("Done!");
close(ARABICTEST);

現時点では意味不明な文字を出力します。

私が思いついたアイデアの 1 つは、問題の文字列を 4 文字のセクション (つまり、16 進コードごと) に分割することでしたが、これを個々の既知の UCS2 16 進値で試してもうまくいかないようです。

また、出力エンコーディングを強制しようとしましたが、そこにも喜びはありませんでした。

ありがとう!

4

1 に答える 1

9

hex16 進文字列をバイト シーケンスにデコードする方法ではありません。 packは。(hexバイトの文字列ではなく、単一の整数を生成します。)それ以外は、あなたは近かったです。これを試して:

use strict;
use warnings;
use Encode;

my $string = "0627062E062A062806270631";
my $decodedHex = pack('H*', $string);

my $perlDecodedUTF8 = decode("UCS-2BE", $decodedHex);

open(my $ARABICTEST,">:utf8", "ucs2test.txt");
print $ARABICTEST $perlDecodedUTF8;
print("Done!");
close($ARABICTEST);

注: おそらく、UCS-2BE の代わりに UTF-16BE を使用する必要があります。それらは基本的に同じものですが、UTF-16BE ではサロゲート ペアが許可され、UCS-2BE では許可されません。したがって、すべての UCS-2BE テキストは有効な UTF-16BE でもありますが、その逆はありません。

于 2011-07-04T09:37:47.483 に答える