iso-8859-1中的perl utf8 encode向javascript utf8编码返回不同的结果



在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              ...........

如果我使用javascript解码perl结果,这就是我得到的:

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 .. .. .. .. .. .. .. .. .. .. .. .. |      |

有人能帮我吗?源代码是一个从flash发送到perl服务器的AMF对象,后者将其重新发送到javascript。数据的发送方式(从flash到perl再到javascript)不会更改任何数据。

perl中的代码是:

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

如果我在perl中使用默认的utf8编码,我会得到相同的结果。

这已经更新为包括十六进制转储,而不是二进制转储。我需要一个perl中的encode方法,它将返回与javascript相同的结果。可以使用此页面进行测试。

任何帮助都将不胜感激。

半个答案:

再次使用PERLQQ符号表示这三个序列。

my $octets =
"x0ax0bx01x11x66x6cx65x78x74x69x6dx65x05x42x73x51".
"xf4xaexa3x70x00x13x74x69x6dx65x73x74x61x6dx70x09".
"x05x01x05x41xd3xc8xa8xa2x40x00x00x04xafxf0x14x03".
"x61x09x03x01x09x0bx01x04x01x04x02x04x03x04x04x04".
"x05x01";
my $utf8_encoded_octets =
"x0ax0bx01x11x66x6cx65x78x74x69x6dx65x05x42x73x51".
"xc3xb4xc2xaexc2xa3x70x00x13x74x69x6dx65x73x74x61".
"x6dx70x09x05x01x05x41xc3x93xc3x88xc2xa8xc2xa2x40".
"x00x00x04xc2xafxc3xb0x14x03x61x09x03x01x09x0bx01".
"x04x01x04x02x04x03x04x04x04x05x01";
my $received =
"x00x0bx00x01x00x11x00x66x00x6cx00x65x00x78x00x74".
"x00x69x00x6dx00x65x00x05x00x42x00x73x00x51x4bxa3".
"x00x70x00x00x00x13x00x74x00x69x00x6dx00x65x00x73".
"x00x74x00x61x00x6dx00x70x00x09x00x05x00x01x00x05".
"x00x41x04xc8x88x80x00x00x00x00x00x04xfcx14x00x03".
"x00x61x00x09x00x03x00x01x00x09x00x0bx00x01x00x04".
"x00x01x00x04x00x02x00x04x00x03x00x04x00x04x00x04".
"x00x05x00x01";

第三个是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       : ..     |
+---+----------------------------+----------------------------+

最新更新