函數程式碼
<?php
function chineseFirst($str) {
$str = iconv("UTF-8", "gb2312", $str); // 若程式為 GBK 編碼請註解此行
// 判斷是否為中文(雙位元組)
if (preg_match("/^[\x7f-\xff]/", $str)) {
$fchar = ord($str{0});
if ($fchar >= ord("A") && $fchar <= ord("z")) return strtoupper($str{0});
$a = $str;
$val = ord($a{0}) * 256 + ord($a{1}) - 65536;
if ($val >= -20319 && $val <= -20284) return "A";
if ($val >= -20283 && $val <= -19776) return "B";
if ($val >= -19775 && $val <= -19219) return "C";
if ($val >= -19218 && $val <= -18711) return "D";
if ($val >= -18710 && $val <= -18527) return "E";
if ($val >= -18526 && $val <= -18240) return "F";
if ($val >= -18239 && $val <= -17923) return "G";
if ($val >= -17922 && $val <= -17418) return "H";
if ($val >= -17417 && $val <= -16475) return "J";
if ($val >= -16474 && $val <= -16213) return "K";
if ($val >= -16212 && $val <= -15641) return "L";
if ($val >= -15640 && $val <= -15166) return "M";
if ($val >= -15165 && $val <= -14923) return "N";
if ($val >= -14922 && $val <= -14915) return "O";
if ($val >= -14914 && $val <= -14631) return "P";
if ($val >= -14630 && $val <= -14150) return "Q";
if ($val >= -14149 && $val <= -14091) return "R";
if ($val >= -14090 && $val <= -13319) return "S";
if ($val >= -13318 && $val <= -12839) return "T";
if ($val >= -12838 && $val <= -12557) return "W";
if ($val >= -12556 && $val <= -11848) return "X";
if ($val >= -11847 && $val <= -11056) return "Y";
if ($val >= -11055 && $val <= -10247) return "Z";
} else {
return false;
}
}
?>
原理說明
- 將 UTF-8 轉 GB2312(內碼),取雙位元組高低位計算內碼值
- 內碼值減 65536 得到負數區間
- 根據 GB2312 區位碼對應拼音首字母範圍對照表判斷
- 非中文輸入返回
false
使用範例
<?php
echo chineseFirst("張三"); // Z
echo chineseFirst("李四"); // L
echo chineseFirst("王五"); // W
?>
注意事項
- 需開啟
iconv 擴展
- 僅支援常用漢字範圍,生僻字可能無法正確判斷
- 專案若為 GBK 編碼,請移除
iconv 轉換行