用PHP解码UTF-16

用PHP解码UTF-16,php,character-encoding,utf-16,Php,Character Encoding,Utf 16,我偶然发现了一段用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

我偶然发现了一段用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
$chars=array(109,0,97,0,110,0,105,0,102,0,101,0,115,0,116,0);
$length=16;
$data=“”;
对于($i=0;$i<$length;$i++){
$data.=pack(“c”、$chars[$i]);
如果(substr($data,-2)=“\x00\x00”){
打破
}
}
$end=strpos($data,“\x00\x00”);
如果($end!==false){
$data=substr($data,0,$end);
}
//md_convert_encoding()似乎不起作用
printf(strlen($data));//产出16
我看到的唯一解决方案是放弃UTF魔术,将循环更改为:

for ($i = 0; $i < $length; $i+=2)
($i=0;$i<$length;$i+=2)的

有什么我可以做的,或者只是使用修改过的for循环


谢谢。

首先看一看

使用该解决方案,您可以将字节数组转换为类似

$chars = array(109, 0, 97, 0, 110, 0, 105, 0, 102, 0, 101, 0, 115, 0, 116, 0);
$str = call_user_func_array("pack", array_merge(array("C*"), $chars));
$convertedStr = iconv('utf-16', 'utf-8', $str);

var_dump($str);
var_dump($convertedStr);
执行此脚本将输出

string(16) "manifest"
string(8) "manifest"

“解码UTF-16”到底是什么?你的主要问题是
utf8_encode
远不及
unicode
在Python中的作用。@deceze:是的,我注意到了,但它似乎已经过时了;我将删除它。要回答我自己的问题,请加三条注释:你的问题应该是“将整数数组解释为UTF-16编码字节并将其转换为UTF-8编码字符串”…啊,
iconv
似乎做得更好!顺便问一下,“C*”和“C”之间有什么明显的区别吗?你需要星号,否则只有第一个字符会被压缩。在这种情况下,使用“c”还是“c”没有什么区别,因为所有数字都小于127,因此都适合有符号和无符号字符字节。