\x{6d4b}\x{8bd5}\x{4eba}\x{5458} 和 \x4b\x6d\xd5\x8b 完全是不同的东西。
首先澄清几个概念:
1. Perl中的字符串有两种存储方式:字节方式,宽字符方式(wide character)。
2. 宽字符方式每个字符占16位,是个0-65535的整数。
3. 宽字符的字符串不能被输出,也不能用作base64这样基于字节的字符串处理。
4. 为什么宽字符是16位?因为16位能完整地表示Unicode的所有字符。
你得到的 \x{6d4b}\x{8bd5}\x{4eba}\x{5458} 就是“测试人员”的宽字符形式。
5. 宽字符转换成字节要用 utf8::encode($str),反向转换用 utf8::decode($str)。
注意用这两个函数时不需要use utf8也不能use utf8,use utf8有别的意思,会产生重大影响!
6. \x{6d4b}\x{8bd5}\x{4eba}\x{5458}用 utf8::encode处理完后结果是
\xe6\xb5\x8b\xe8\xaf\x95\xe4\xba\xba\xe5\x91\x98
这才是应该传给 base64的数据。

没有评论:
发表评论