json_encode

 json_encode默认对中文字符做unicode编码字符串化处理

PHP的json_encode来在处理到中文的时, 中文字符会被处理为:按中文字符对应的unicode的16进制编号前加上\u来表示。例如:”中文” 两个字被表示为\u4e2d\u6587。
这样的问题是增加了传输量,例如”中文” 的utf8编码占6个字节,”\u4e2d\u6587″占12个字节了,增加了一倍。

在PHP5.4中, 这个问题得以解决, json_encode增加了一个选项: JSON_UNESCAPED_UNICODE,意思是对中文字符不做unicode编码字符串化处理,保持其原编码字节内容。
示例:

echo json_encode("《程序员读》", JSON_UNESCAPED_UNICODE);

 json_encode的其它功能及选项

http://www.php.net/manual/ru/function.json-encode.php

提升苹果推送的中文字符长度

apple推送内容要求是json格式,长度限制为256字节内,若超过了256字节,fwrite函数就要返回false了。由于aps、deviceToken、json符号等会占用部分长度,真正文字内容部分大约占200字节以下。

  • 一个汉字的unicode编号串占6字节,200字节可以容纳33个汉字。
  • 一个汉字采用gbk或utf8占2到3个字节,200字节可以容纳66到100个汉字。

在php5.4及以上的版本,在这里使用JSON_UNESCAPED_UNICODE正当时

$body['aps'] = array('alert' =>'《程序员读》','sound' => 'default');
$payload = json_encode($body,JSON_UNESCAPED_UNICODE);

如果php版本低于5.4,以下代码强制让json中的unicode转成中文

$payload = json_encode($content);
$payload = preg_replace_callback(‘/\\\\u([0-9a-fA-F]{4})/u’, create_function(‘$match’, ‘return mb_convert_encoding(pack(“H*”, $match[1]), “utf-8″, “UTF-16BE”);’), $payload);

发表评论