萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 漢字轉拼音類(支援首字母/全拼/大小寫)

Helper_Spell:高效能漢字轉拼音工具類

基於預編碼拼音表(pytable_without_tune.txt),提供靜態方法獲取首字母、全拼、可選大小寫,支援混合中英數字串。

核心功能

  • getChineseFirstChar($str, $firstOnly=false, $upper=false):取首字母或首字全拼
  • getChineseChar($str, $firstOnly=false, $upper=false):整串轉拼音,空格分隔
  • 內建 utf8_str_split() 正確切分 UTF-8 字元
  • 非漢字字元原樣保留

完整類別代碼

<?php
class Helper_Spell {
    static public function getArray() {
        return unserialize(file_get_contents('pytable_without_tune.txt'));
    }

    static public function getChineseFirstChar($string, $isOne=false, $upper=false) {
        $spell = self::getArray();
        $chars = self::utf8_str_split($string, 1);
        $first = $chars[0];

        if (preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $first)) {
            $result = $spell[$first][0];
        } else {
            $result = $first;
        }
        $result = $isOne ? substr($result, 0, 1) : $result;
        return $upper ? strtoupper($result) : $result;
    }

    static public function getChineseChar($string, $isOne=false, $upper=false) {
        $spell = self::getArray();
        $chars = self::utf8_str_split($string, 1);
        $result = [];

        foreach ($chars as $char) {
            if (preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $char)) {
                $py = $spell[$char][0];
            } else {
                $py = $char;
            }
            $py = $isOne ? substr($py, 0, 1) : $py;
            $result[] = $upper ? strtoupper($py) : $py;
        }
        return implode(' ', $result);
    }

    private static function utf8_str_split($str, $len=1) {
        if (!ctype_digit((string)$len) || $len < 1) return false;
        $mbLen = mb_strlen($str, 'UTF-8');
        if ($mbLen <= $len) return [$str];
        preg_match_all('/.{'.$len.'}|[^\x00]{1,'.$len.'}$/us', $str, $m);
        return $m[0];
    }
}
?>

使用範例

echo Helper_Spell::getChineseFirstChar('我是作者');        // wo
echo Helper_Spell::getChineseFirstChar('我是作者', true);   // w
echo Helper_Spell::getChineseFirstChar('我是作者', true, true); // W

echo Helper_Spell::getChineseChar('我是作者');       // wo shi zuo zhe
echo Helper_Spell::getChineseChar('我是作者', true);  // w s z z
echo Helper_Spell::getChineseChar('我是作者', false, true); // WO SHI ZUO ZHE

拼音表來源

pytable_without_tune.txt 為序列化陣列,鍵為漢字,值為拼音陣列(如 '我' => ['wo', 'wo3'])。可從開源專案(如 overtrue/pinyin)匯出或自行編碼。

效能提示

  • 靜態快取 $spellArray 避免重複讀檔
  • 大量轉換時,考慮將拼音表載入 Redis/APCu
  • 若需聲調數字,請使用完整拼音表並調整索引
copyright © 萬盛學電腦網 all rights reserved