ord()函數把字元轉換為十進制數字,chr()函數把十進制數字轉化為字元,在二進制,八進制,十進制與十六進制之間充當橋梁的作用
中文字元編碼研究系列第三期,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性能比較