自由的风's Archivers

From 自由的风 on 2014-09-27 22:27:15

微博内容字数统计函数(PHP版)

最近在做一个项目,其中一部分的内容就是文章内容跟微博的同步,即在发布文章时,同步更新到微博。



需要解决的问题之一就是判断文章内容的长度,因为微博(包括新浪微博和腾讯微博)都有字数限制,不能超过140字,如果超过了,就会发布失败。



但微博的字数统计方法又有点特殊,其将中文字符作为一个长度,英文、数字、标点符号等两个为一个长度。PHP中常用的字数统计函数有strlen和mb_strlen等,在strlen函数中,统计得到的是字符串所占的字节数,其对待一个UTF8编码的中文字符是3个字节的长度,对于GB2312的中文编码,得到的则是2个字节长度,英文则是一个字节的长度;而在mb_strlen函数中,中英文都会被计算为一字节的长度。因此,使用PHP自带的函数进行微博内容字数统计,显然会造成统计结果错误。



解决方案





PHP版微博内容字数统计函数如下:



/*
//获取微博字符长度
*/
function WeiboLength($str)
{
$arr = arr_split_zh($str); //先将字符串分割到数组中

foreach ($arr as $v){
$temp = ord($v); //转换为ASCII码
if ($temp > 0 && $temp < 127) {
$len = $len+0.5;
}else{
$len ++;
}
}
return ceil($len); //加一取整
}

/*
//拆分字符串函数,只支持 gb2312编码
//参考:http://u-czh.iteye.com/blog/1565858
*/
function arr_split_zh($tempaddtext){
$tempaddtext = iconv("UTF-8", "GBK//IGNORE", $tempaddtext);
$cind = 0;
$arr_cont=array();

for($i=0;$i<strlen($tempaddtext);$i++)
{
if(strlen(substr($tempaddtext,$cind,1)) > 0){
if(ord(substr($tempaddtext,$cind,1)) < 0xA1 ){ //如果为英文则取1个字节
array_push($arr_cont,substr($tempaddtext,$cind,1));
$cind++;
}else{
array_push($arr_cont,substr($tempaddtext,$cind,2));
$cind+=2;
}
}
}

foreach ($arr_cont as &$row)
{
$row=iconv("gb2312","UTF-8",$row);
}

return $arr_cont;
}


说明




  1. 将字符串分割到数组中,不能简单地使用str_split等函数,分割英文字符串还行,但对待中/英文以及数字/符号等混编的内容来说,会生成完全乱码的内容。

  2. 基于第一点,本文使用了http://u-czh.iteye.com/blog/1565858一文中提供的字符串拆分函数,但在实际使用过程中,发现对于一些经过strip_tags函数过滤后的内容,会生成乱码的内容,本文的解决方案是将:$tempaddtext = iconv("UTF-8", "gb2312", $tempaddtext); 修订为:$tempaddtext = iconv("UTF-8", "GBK//IGNORE", $tempaddtext);



测试结果



使用如下一段文本进行测试。



#IT资讯#众所周知微软非常渴望缓解Windows 8/8.1系统占比不高的尴尬,已经迫不及待的想要介绍精心改良的Windows 9操作系统,但是这一天还需要再等待一段时间。因为根据NPD集团在今年的返校季调查结果显示最大的赢家并不是Windows PC,而是Mac和Chromebooks。


新浪微博统计结果如下:



<img src="http://loosky.net/Upload/2014/09/weibo-e1411827601531.png" alt="enter image description here" />



统计结果为120个字符。



接下来,分别使用三个函数的测试结果如下:



<img src="http://loosky.net/Upload/2014/09/experiment-e1411827671960.png" alt="enter image description here" />



本文函数的统计结果与微博的统计结果一致。



目前的使用过程中还都正常,不排除一些情况下会出现异常,望大家反馈。


查看完整版本: 微博内容字数统计函数(PHP版)

From 张戈博客 on 2015-01-22 10:58:16

正好用到了,感谢分享。

Tags: PHP, 微博, 新浪微博


©自由的风