將中文字串轉為拼音首字母大寫(A-Z),常用於通訊錄排序、索引列表、首字母導航等場景。
<?php
/**
* 取得中文字串首字母(拼音首字母大寫)
* @param string $str 輸入字串(UTF-8 編碼)
* @return string|false 首字母或 false(非中文開頭)
*/
function chineseFirst($str) {
// 若程式本身為 GBK 編碼,請註解下一行
$str = iconv('UTF-8', 'GB2312//IGNORE', $str);
// 判斷是否為中文(雙位元組,高位元組 >= 0x80)
if (!preg_match('/^[\x80-\xff]/', $str)) {
return false;
}
$firstChar = $str[0];
$ordVal = ord($firstChar);
// 若首字元為英文字母,直接回傳大寫
if ($ordVal >= ord('A') && $ordVal <= ord('z')) {
return strtoupper($firstChar);
}
// 計算 GB2312 區位碼對應數值
// GB2312 中文編碼:高位 0xA1-0xF7,低位 0xA1-0xFE
// 轉換公式:(高位元組 * 256 + 低位元組) - 65536
$val = ord($str[0]) * 256 + ord($str[1]) - 65536;
// 依據區位碼範圍對應拼音首字母
// 來源:GB2312 編碼表拼音區間
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';
return false; // 理論上不會到達
}
echo chineseFirst('張三'); // Z
echo chineseFirst('李四'); // L
echo chineseFirst('王五'); // W
echo chineseFirst('ABC'); // A
echo chineseFirst('123'); // false
function chineseFirstAll($str) {
$str = iconv('UTF-8', 'GB2312//IGNORE', $str);
$len = strlen($str);
$result = '';
for ($i = 0; $i < $len; $i++) {
$ordVal = ord($str[$i]);
if ($ordVal >= 0x80) { // 中文雙位元組
if ($i + 1 < $len) {
$result .= chineseFirst(substr($str, $i, 2));
$i++; // 跳過低位元組
}
} elseif (ctype_alpha($str[$i])) {
$result .= strtoupper($str[$i]);
}
}
return $result;
}
echo chineseFirstAll('中國人民'); // ZGRM
PHP 5.3+ 內建 Transliterator 可更準確處理多語言轉寫:
$transliterator = Transliterator::create('Any-Latin; Latin-ASCII; Upper');
echo $transliterator->transliterate('張三'); // ZHANG SAN
// 取首字母
echo preg_replace('/[^A-Z]/', '', $transliterator->transliterate('張三')); // ZS
優點:支援繁體、罕見字、多音字;缺點:需安裝 intl 擴充套件、效能較純陣列查表慢。