Преобразование UCS2 (Неизвестный LE или BE) в числовом шестнадцатеричном формате в UTF-8 с использованием Perl - PullRequest
2 голосов
/ 04 июля 2011

Надеюсь, что кто-то может указать мне, в каком направлении я ошибаюсь:

У меня есть строка (во что я верю) с шестнадцатеричным кодированием UCS2, но поставщик не может сказать мне, еслиэто UCS2-LE или UCS2-BE.

Примерно так: 0627062E062A062806270631

Это переводится так: اختبا

По-арабски, по-видимому ... но неважно, япопробуйте преобразовать его из шестнадцатеричного, используя его как прямой UCS2 (LE или BE) или практически что-нибудь еще, о чем я могу думать под солнцем, я не могу превратить его в native-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);

В данный момент выводит бессмысленные символы.

Теперь пришла одна идеябыло разделить рассматриваемую строку на 4-символьные секции (т. е. на шестнадцатеричный код), но даже попытка выполнить это с отдельным известным шестнадцатеричным значением UCS2, похоже, не работает.

Также попытался принудительно вызватьвыходная кодировка, радости там тоже нет.

Спасибо!

1 Ответ

8 голосов
/ 04 июля 2011

hex - это не способ декодирования шестнадцатеричной строки в последовательность байтов.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);

Примечание: вы, вероятно, хотите использовать UTF-16BE вместо UCS-2BE.По сути, это одно и то же, но UTF-16BE допускает суррогатные пары, а UCS-2BE - нет.Таким образом, весь текст UCS-2BE также является допустимым UTF-16BE, но не наоборот.

...