程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP中英文混合的字符串實現表格對齊功能

PHP中英文混合的字符串實現表格對齊功能

編輯:PHP綜合

關於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   | 嗯嗯   |             | 1    | 1      |
| 10 | 1   | 好的 |             | 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   | 嗯嗯     |             | 1    | 1      |
| 10 | 1   | 好的     |             | 1    | 1      |
+----+-----+----------+-------------+------+--------+
*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved