漢字的GBK編碼也是把一個(gè)漢字用兩個(gè)字節(jié)來表示,其首字節(jié)對(duì)應(yīng)0x81-0xFE(即129-224),尾字節(jié)對(duì)應(yīng)除掉(0x7F)的0x40-oxFE(即64-126和128-224)
我們一般判斷一個(gè)字是否是漢字都是根據(jù)其首字節(jié)來判斷,我們來看漢字的GBK編碼首字節(jié)的起始編碼0x81,其二進(jìn)制即為0000 1000 0000 0000, 可見若一個(gè)字符的二進(jìn)制邏輯與0x81之后為0時(shí),該字符一定小于0x81,此時(shí)該字符必定不是漢字,反之,該字符應(yīng)該是一個(gè)漢字的首字節(jié)。
結(jié)合以上原理就不難理解一個(gè)中英文混合字符串的截取的常用代碼:
function gb_substr($str, $start, $len)
{
$s = '';
$j = 0;
for ($i=0; $i<strlen($str); $i++) {
if (ord($str[$i]) & 0x81 != 0) { //或者ord($str[$i]) > '0x80'
$t = $str[$i].$str[$i+1];
if (($i >= $start) && ($i+1 < $start+$len)) $s.= $t;
$i++;
} else {
$t = $str[$i];
if (($i >= $start) && ($i < $start+$len)) $s.= $t;
}
if ($i >= $start+$len) break;
}
return $s;
}