кодирование perl utf8 из iso-8859-1 возвращает другой результат в кодировку javascript utf8 - PullRequest
1 голос
/ 27 января 2012

В perl, если я кодирую следующее от iso-8859-1 до utf8.

(00000)   0a0b0111 666c6578 74696d65 05427351   ....flextime.BsQ
(00016)   f4aea370 00137469 6d657374 616d7009   ...p..timestamp.
(00032)   05010541 d3c8a8a2 40000004 aff01403   ...A....@.......
(00048)   61090301 090b0104 01040204 03040404   a...............
(00064)   0501                                  ..

Это результат:

(00000)   0a0b0111 666c6578 74696d65 05427351   ....flextime.BsQ
(00016)   c3b4c2ae c2a37000 1374696d 65737461   ......p..timesta
(00032)   6d700905 010541c3 93c388c2 a8c2a240   mp....A........@
(00048)   000004c2 afc3b014 03610903 01090b01   .........a......
(00064)   04010402 04030404 040501              ...........

Если я декодирую результат perl, используя javascript, это то, что я получаю:

00000000: 00 0b 00 01 00 11 00 66 00 6c 00 65 00 78 00 74 00 69 00 6d 00 65 00 05 00 42 00 73 00 51 4b a3 |flextimeBsQ.|
00000016: 00 70 00 00 00 13 00 74 00 69 00 6d 00 65 00 73 00 74 00 61 00 6d 00 70 00 09 00 05 00 01 00 05 |ptimestamp.|
00000032: 00 41 04 c8 88 80 00 00 00 00 00 04 fc 14 00 03 00 61 00 09 00 03 00 01 00 09 00 0b 00 01 00 04 |A...a..|
00000048: 00 01 00 04 00 02 00 04 00 03 00 04 00 04 00 04 00 05 00 01 .. .. .. .. .. .. .. .. .. .. .. .. |      |

Может ли кто-нибудь помочь мне с этим? Источником является объект AMF, отправленный из флэш-памяти на сервер Perl, который повторно отправляет его в JavaScript Способ отправки данных (от flash до perl и javascript) не меняет никаких данных.

Код в Perl:

use Encoding;
from_to($out,"iso-8859-1","utf8",Encode::FB_WARN);

Если я использую кодировку utf8 по умолчанию в perl, я получаю тот же результат.

Это было обновлено, чтобы включить шестнадцатеричный дамп вместо двоичного. Мне нужен метод кодирования в Perl, который будет возвращать тот же результат, что и JavaScript. Можно протестировать , используя эту страницу .

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 27 января 2012

Половина ответа:

Снова три последовательности в обозначении PERLQQ.

my $octets =
"\x0a\x0b\x01\x11\x66\x6c\x65\x78\x74\x69\x6d\x65\x05\x42\x73\x51".
"\xf4\xae\xa3\x70\x00\x13\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\x09".
"\x05\x01\x05\x41\xd3\xc8\xa8\xa2\x40\x00\x00\x04\xaf\xf0\x14\x03".
"\x61\x09\x03\x01\x09\x0b\x01\x04\x01\x04\x02\x04\x03\x04\x04\x04".
"\x05\x01";

my $utf8_encoded_octets =
"\x0a\x0b\x01\x11\x66\x6c\x65\x78\x74\x69\x6d\x65\x05\x42\x73\x51".
"\xc3\xb4\xc2\xae\xc2\xa3\x70\x00\x13\x74\x69\x6d\x65\x73\x74\x61".
"\x6d\x70\x09\x05\x01\x05\x41\xc3\x93\xc3\x88\xc2\xa8\xc2\xa2\x40".
"\x00\x00\x04\xc2\xaf\xc3\xb0\x14\x03\x61\x09\x03\x01\x09\x0b\x01".
"\x04\x01\x04\x02\x04\x03\x04\x04\x04\x05\x01";

my $received =
"\x00\x0b\x00\x01\x00\x11\x00\x66\x00\x6c\x00\x65\x00\x78\x00\x74".
"\x00\x69\x00\x6d\x00\x65\x00\x05\x00\x42\x00\x73\x00\x51\x4b\xa3".
"\x00\x70\x00\x00\x00\x13\x00\x74\x00\x69\x00\x6d\x00\x65\x00\x73".
"\x00\x74\x00\x61\x00\x6d\x00\x70\x00\x09\x00\x05\x00\x01\x00\x05".
"\x00\x41\x04\xc8\x88\x80\x00\x00\x00\x00\x00\x04\xfc\x14\x00\x03".
"\x00\x61\x00\x09\x00\x03\x00\x01\x00\x09\x00\x0b\x00\x01\x00\x04".
"\x00\x01\x00\x04\x00\x02\x00\x04\x00\x03\x00\x04\x00\x04\x00\x04".
"\x00\x05\x00\x01";

Третий кодируется в кодировке UTF-16BE , столбцы 00 являются подсказкой. Результатом декодирования является последовательность октетов, аналогичная первой, за исключением того, что первый октет 0a отсутствует. Другие различия помечены * ниже, у меня нет объяснения этим.

Test::HexDifferences::eq_or_dump_diff(
    $octets,
    "\x0a".encode('UTF-8', decode('UTF-16BE', $received))
);

+---+----------------------------+----------------------------+
| Ln|Got                         |Expected                    |
+---+----------------------------+----------------------------+
|  1|0000 : 0A 0B 01 11 : ....   |0000 : 0A 0B 01 11 : ....   |
|  2|0004 : 66 6C 65 78 : flex   |0004 : 66 6C 65 78 : flex   |
|  3|0008 : 74 69 6D 65 : time   |0008 : 74 69 6D 65 : time   |
|  4|000C : 05 42 73 51 : .BsQ   |000C : 05 42 73 51 : .BsQ   |
*  5|0010 : F4 AE A3 70 : ...p   |0010 : E4 AE A3 70 : ...p   *
|  6|0014 : 00 13 74 69 : ..ti   |0014 : 00 13 74 69 : ..ti   |
|  7|0018 : 6D 65 73 74 : mest   |0018 : 6D 65 73 74 : mest   |
|  8|001C : 61 6D 70 09 : amp.   |001C : 61 6D 70 09 : amp.   |
|  9|0020 : 05 01 05 41 : ...A   |0020 : 05 01 05 41 : ...A   |
* 10|0024 : D3 C8 A8 A2 : ....   |0024 : D3 88 E8 A2 : ....   *
* 11|0028 : 40 00 00 04 : @...   |0028 : 80 00 00 04 : ....   *
* 12|002C : AF F0 14 03 : ....   |002C : EF B0 94 03 : ....   *
| 13|0030 : 61 09 03 01 : a...   |0030 : 61 09 03 01 : a...   |
| 14|0034 : 09 0B 01 04 : ....   |0034 : 09 0B 01 04 : ....   |
| 15|0038 : 01 04 02 04 : ....   |0038 : 01 04 02 04 : ....   |
| 16|003C : 03 04 04 04 : ....   |003C : 03 04 04 04 : ....   |
| 17|0040 : 05 01       : ..     |0040 : 05 01       : ..     |
+---+----------------------------+----------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...