@walkor Demo里面提供的JsonProtocal.php 在处理中文上有点问题
原因在于strlen并不能正确返回长度
例如:
$zhStr = '中文混合eng!';
echo strlen($zhStr); // 输出:18
要换成mb_strlen 我也是查手册才知道的
同理还有substr函数。要换成mb_substr
由于我不了解php 才看了一天而已。但是改成下面这样就能工作了。
老大你看下。是否要加更多的逻辑。
class JsonProtocol
{
// 根据首部四个字节(int)判断数据是否接收完毕
public static function check($buffer)
{
// 读取首部四个字节
$buffer_data = unpack('Ntotal_length', $buffer);
// 得到这次数据的整体长度(字节)
$total_length = $buffer_data;
// 已经收到的长度(字节)
$recv_length = mb_strlen($buffer,'utf-8');
if($total_length>$recv_length)
{
// 还有这么多字节要接收
return $total_length - $recv_length;
}
// 接收完毕
return 0;
}
// 打包
public static function encode($data)
{
// 选用json格式化数据
$buffer = json_encode($data);
// 包的整体长度为json长度加首部四个字节(首部数据包长度存储占用空间)
$total_length = 4 + mb_strlen($buffer,'utf-8');
return pack('N', $total_length) . $buffer;
}
// 解包
public static function decode($buffer)
{
echo $buffer;
$buffer_data = unpack('Ntotal_length', $buffer);
// 得到这次数据的整体长度(字节)
$total_length = $buffer_data;
echo $total_length;
// json的数据
$json_string = mb_substr($buffer, 4, $total_length-4, 'utf-8');
echo $json_string;
return json_decode($json_string, true);
}
}