中文字元編碼研究系列第三期,PHP函數篇掌握ord()與 chr()函數應用,上期[PHP基礎篇詳解ASCII碼對照表與字元轉換]一文中瞭解了ASCII碼和字元轉換的方法,但使用時發現在字元轉換之間需要兩個特殊的函數,用於字元與十進位之間的轉換,ord()函數把字元轉換為十進位數字,chr()函數把十進位數字轉化為字元,在二進位,八進位,十進位與十六進位之間充當橋樑的作用。
一,ord()函數的應用
ord()函數用於返回一個字元的ASCII值,最基本的用法如擷取a 的ASCII值ord('a')返回 97,但在實際開發中,應用最多的還是用於字元截取函數中擷取中文字元高低位編碼的十進位數,如常見的中文字元截取函數具體可看看PHPWind或 Discuz!論壇原始碼中substrs()函數或cutstr()函數,其原理就是通過ord()函數擷取字元的ASCII碼值,如果傳回值大於 127則表示為中文字元的一半,再擷取後一半組合成一個完整字元,同時結合字元編碼如GBK或UTF-8等。
以GBK編碼為例利用ord()函數判斷中文字元返回各中文字元的ASCII值,代碼如下 複製代碼 代碼如下:$string = "不要迷戀哥";
$length = strlen($string);
var_dump($string);//原始中文
var_dump($length);//長度
$result = array();
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = $string[$i].' '.$string[++$i];
}
}
var_dump($result);
代碼說明
1,定義一個變數$string,其值為字串
2,擷取變數的長度(位元組數)
3,列印變數和變數的長度
4,通過for迴圈擷取變數的各個位元組值,把一個漢字的兩個位元組中間用空格隔開顯示。
結果如
圖解:“不要迷戀哥”為5個漢字,共10個位元組(一個漢字2個位元組),分別列印各個位元組無法正常顯示如
初始值不變修改for迴圈部分代碼顯示各個位元組ASCII值複製代碼 代碼如下:$result = array();
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
如上代碼使用ord()函數列印各個字元的ASCII值,結果如下
通過ord()函數轉換後就能正常查看各個字元的ASCII值。
二,chr()函數的應用
chr()函數的作用與ord()函數相反,用於返回指定的字元,如chr(97)返回a。
結合上面執行個體,只要擷取到中文字元的ASCII值,就可以通過chr()函數組裝出中文字元,代碼如下 複製代碼 代碼如下:$string = "不要迷戀哥";
$length = strlen($string);
var_dump($string);//原始中文
var_dump($length);//長度
$result = array();
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
foreach($result as $v){
$decs = explode(" ",$v);
echo chr($decs[0]).chr($decs[1]);
}
結果如
如上代碼並沒有直接輸出中文字元,但列印出正常的漢字,其原理是首先擷取各個位元組的ASCII值,通過chr()函數轉化為位元組,再把兩個位元組組合起來就形成了一個完整的中文漢字。
通過對ord()與chr()函數的討論已經初步瞭解了中文字元的編碼原理,瞭解GBK編碼中一個漢字二個位元組,使用ord()與chr()函數實現各位元組轉換方法,請關注下一期中文字元編碼研究系列之中文字元編碼轉換原理。
參考資料
PHPWind與Discuz截取字元函數substrs與cutstr效能比較