首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 取得中文字串首字母(拼音首字母)函數實作

     編輯:PHP 相關知識

函數用途

將中文字串轉為拼音首字母大寫(A-Z),常用於通訊錄排序、索引列表、首字母導航等場景。

完整函數程式碼(相容 UTF-8/GBK)

<?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 Intl 擴充套件

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 擴充套件、效能較純陣列查表慢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved