Преобразование шестнадцатеричной строки UTF-16 во внутреннем представлении Perl

Я не знаю, почему этот код не работает:

use strict;
use warnings;
use Encode qw/decode/;
my $entity_unicode = "00A0";
$entity_unicode = decode("UTF-16", pack('H4', $entity_unicode));
print $entity_unicode, "\n";

Он печатает: "UTF-16: Нераспознанная спецификация a0 в /usr/lib/perl/5.10/Encode.pm строка 174.".

2 ответа

Решение
$entity_unicode = decode("UTF-16BE", pack('H4', $entity_unicode));

Указание "UTF-16BE" вместо просто "UTF-16" скажет ему принять порядок байтов с прямым порядком байтов.

См. Как я могу декодировать данные UTF-16 в Perl, когда я не знаю порядок байтов?

Без спецификации (U+FEFF) в начале строки для декодирования невозможно узнать, является ли 00 A0 U+00A0 (UTF-16be) или U+0A00 (UTF-16le, используется Windows). Нужно указать точное кодирование, когда спецификация отсутствует. В данном случае это UTF-16be.

Другие вопросы по тегам