為了處理 preg_match 中文字的問題[2],想把中文字轉換成16進位的編碼,如「一」是0xe4b880,好讓程式取用,網路上找不到適合的,有發現HTML用的UNICODE[1],不符需要只好自己來寫。
$str="一籲乂龘"; mb_internal_encoding("UTF-8"); $mlen = mb_strlen($str); for($ii=0;$ii<$mlen; $ii++){ $w= mb_substr($str,$ii,1); $len= strlen( $w); print $w .": "; for($jj=0;$jj<$len; $jj++){ print ord( substr($w,$jj,1)). " "; $r[$jj]= dechex( ord( substr($w,$jj,1))); } print implode($r). "\n"; }
原本想用第一碼來判斷一個中文字的BYTES數[2],後來改用mb_的函數來解決,算是偷懶的作法。
第一碼>=192開頭是2字節
110xxxxx xxxxxxxx
第一碼>=224開頭是3字節
1110xxxx xxxxxxxx xxxxxxxx
第一碼>=240開頭是4字節
11110xxx xxxxxxxx xxxxxxxx xxxxxxxx
執行結果
一: 228 184 128 e4b880
籲: 231 177 178 e7b1b2
乂: 228 185 130 e4b982
龘: 233 190 152 e9be98
如果有字碼該如何印出來,直接把16進位值合裡來放到字串就可以了[3]:
echo "\xe6\x88\x91"; //我
或是
echo chr(228).chr(184).chr(128); //一
這轉換最後沒能解決我一開始要處理的中文字字串比對的問題,算有點徒勞,不過也許有人會有需要。
判斷中文字?
判斷是否為中文字,只有檢查第一碼是不是>224是不夠的,因為224~240這個區段包含了中文、日文、韓文、一堆符號。
有一些我研究的結果可供參考[4]:
部首
226,188,128=> ⼀ 226,191,149=> ⿕
主字群+拓展
227,144,128=> 㐀 233,190,187=> 龻
unicode 兼容漢字
239,164,128=> 豈 239,169,170=> 頻
參考資料
[1] 中文字轉 HTML UNICODE http://www.csie.ntu.edu.tw/~piaip/unihtml/
[2] 正則匹配中文汉字 http://www.5idev.com/p-php_preg_match.shtml 此例無效
[3] http://www.ptt.cc/bbs/PHP/M.1221550095.A.C82.html
[4] https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php
原文 2013-09-23 15:28:25