& 0x80 而非 > 0x7F0x7F = 0111 1111
0x80 = 1000 0000
ord($ch) & 0x80 只檢查最高位,若非 0 則為 1,極快且無符號/負數歧義。char 可能為有符號,> 0x7F 會因負數導致誤判;位運算無此問題。<?php
function isGbkFirstByte($ch) {
return (ord($ch) & 0x80) !== 0;
}
$str = '中a文';
for ($i = 0; $i < strlen($str); $i++) {
$ch = $str[$i];
echo "$ch : " . (isGbkFirstByte($ch) ? '中文首字節' : 'ASCII') . "\n";
}
// 輸出(GBK 編碼下):
// 中 : 中文首字節
// : 中文尾字節(不可直接判斷)
// a : ASCII
// 文 : 中文首字節
// : 中文尾字節
?>
ASCII 字母第 6 位(0x20)區分大小寫:小寫為 1,大寫為 0。
<?php
// 判斷是否小寫
if (ord($c) & 0x20) { /* 小寫 */ }
// 轉大寫:將第 6 位清零
$upper = chr(ord($c) & ~0x20);
// 轉小寫:將第 6 位置一
$lower = chr(ord($c) | 0x20);
?>
原理:'a'(0x61) - 'A'(0x41) = 0x20,位運算比 strtoupper() 更底層,理解編碼本質的好練習。
mbstring 處理多字節:mb_strlen()、mb_substr()、preg_match('/\p{Han}/u', $str) 判斷中文。ord($str) > 0x80(或 & 0x80)利用 GBK 首字節高位為 1 的特性識別中文字節,是早期 PHP 字符串處理的經典技巧。現代項目請優先採用 UTF-8 + mbstring,僅在維護舊系統或編寫編碼檢測庫時涉及此邏輯。