關於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 | +----+-----+----------+-------------+------+--------+*