关于php中英文混合的字符串实现补全对齐功能的实现

浏览:2918 发布日期:2013/06/27 分类:技术分享 关键字: php 字符串 中英文长度
在做sublime text 的Thinkphp插件 中显示数据库查询结果为美化过的表格字符串时,我采用的是symfony console组件里的tableHelper。但是遇到一个问题,中文时 列宽判断不对。

国外始终没考虑中国啊。

原英文效果:


+-----------------+------------------------+------------------+
| ISBN | title | Author |
+-----------------+------------------------+------------------+
| 99921-58-10-7 | Divine Comedy | Dante Alighieri |
| 9971-5-0210-0 | A Tale of Two Cities | Charles Dicken |
| 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien |
+-----------------+------------------------+------------------+


但是中文就乱了:+----+-----+-------+-------------+------+--------+
| id | cid | word  | replacement | type | status |
+----+-----+-------+-------------+------+--------+
| 1  | 1   | 法轮    |             | 1    | 1      |
| 15 | 2   | 上网文凭  | ***         | 2    | 1      |
| 12 | 1   | 法X功   |             | 1    | 1      |
| 10 | 1   | 九ping |             | 1    | 1      |
+----+-----+-------+-------------+------+--------+
原因是它调用的是strlen或者mb_strlen 2个函数

strlen 获取的中文字符 一个中文字符串长度为3,mb_strlen将一个中文字长度为1

而正常对齐显示一个中文对应2个英文字符长度

这样计算出来的长度就不对了。于是我百度如何获取正确的中英混合显示字符串长度

找到了:(strlen($string) + mb_strlen($string,'UTF8')) / 2;这样就能获取到正确的字符串显示用长度

然后这样还是不行,因为填充指定长度时他用的是str_pad函数

这个函数在填充时也将1个中文字当3个英文长度。这个样不论你前面算出的长度 传给他始终小于他计算的字符串长度。

于是我重写了str_pad函数,配合显示长度使用,代码如下:function str_pad($input , $pad_length ,$pad_string , $pad_type){
            $strlen = $this->strlen($input);
            if($strlen < $pad_length){
                $difference = $pad_length - $strlen;
                switch ($pad_type) {
                    case STR_PAD_RIGHT:
                        return $input . str_repeat($pad_string, $difference);
                        break;
                    case STR_PAD_LEFT:
                        return str_repeat($pad_string, $difference) . $input;
                        break;
                    default:
                        $left = $difference / 2;
                        $right = $difference - $left;
                        return str_repeat($pad_string, $left) . $input . str_repeat($pad_string, $right);
                        break;
                }
            }else{
                return $input;
            }
 }
参数和原生的保持一致。

最后改好之后,显示正常了:+----+-----+----------+-------------+------+--------+
| id | cid | word     | replacement | type | status |
+----+-----+----------+-------------+------+--------+
| 1  | 1   | 法轮     |             | 1    | 1      |
| 15 | 2   | 上网文凭 | ***         | 2    | 1      |
| 12 | 1   | 法X功    |             | 1    | 1      |
| 10 | 1   | 九ping   |             | 1    | 1      |
+----+-----+----------+-------------+------+--------+
(现在显示不对齐是因为官网用的是雅黑字体不是等宽字体,大家可以改为宋体看效果)

移植的那个类可以看我发在ThinkPHP官网的扩展:

http://www.thinkphp.cn/extend/396.html
最佳答案
评论( 相关
后面还有条评论,点击查看>>