【发布时间】:2014-08-25 15:13:18
【问题描述】:
我偶然发现了一段用 Python 编写的有趣代码:
from struct import pack
chars = [109, 0, 97, 0, 110, 0, 105, 0, 102, 0, 101, 0, 115, 0, 116, 0]
length = 16
data = ""
for i in range(0, length):
ch = pack("=b", chars[i])
data += unicode(ch, errors='ignore')
if data[-2:] == "\x00\x00":
break
end = data.find("\x00\x00")
if end != -1:
data = data[:end]
print(len(data.decode("utf-16", "replace"))) // outputs 8, string is 'manifest'
如您所见,Python 确实正确解码了utf-16。
但是,当我尝试将代码移植到 PHP 时,我得到了不好的结果:
$chars = array(109, 0, 97, 0, 110, 0, 105, 0, 102, 0, 101, 0, 115, 0, 116, 0);
$length = 16;
$data = "";
for ($i = 0; $i < $length; $i++) {
$data .= pack("c", $chars[$i]);
if (substr($data, -2) == "\x00\x00") {
break;
}
}
$end = strpos($data, "\x00\x00");
if ($end !== false) {
$data = substr($data, 0, $end);
}
// md_convert_encoding() doesn't seem to work
printf(strlen($data)); // outputs 16
我看到的唯一解决方案是放弃 UTF 魔法并将循环更改为:
for ($i = 0; $i < $length; $i+=2)
对此我有什么办法吗,还是只使用修改后的 for 循环?
谢谢。
【问题讨论】:
-
“解码 UTF-16”到什么到底是什么?
-
您的主要问题是
utf8_encode远不及unicode在Python 中的作用。 -
@deceze:是的,我在某个时候注意到了这一点,但它似乎已经过去了;我会删除它。
-
回答我自己的问题三个 cmets:您的问题应该是 “将整数数组解释为 UTF-16 编码字节并将其转换为 UTF-8 编码字符串”...
标签: php character-encoding utf-16