国外始终没考虑中国啊。
原英文效果:
+-----------------+------------------------+------------------+
| ISBN | ti
+-----------------+------------------------+------------------+
| 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
最佳答案