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

PHP 獲取漢字拼音類:支援全拼、首字母、自定義分隔符

     編輯:PHP 相關知識

基於漢字編碼區間映射表實現的拼音轉換類,無需外部擴展,支援全拼輸出、首字母縮寫、自定義分隔符與長度截取。

核心原理

  • GB2312/GBK 編碼中,漢字佔兩個位元組,高位元組 161-255,低位元組 161-255。
  • 將雙位元組轉為無負號整數:$num = $high * 256 + $low - 65536(得到負數區間)。
  • 預建拼音映射表 $pylist(拼音 => 區間起始碼),按區間查找所屬拼音。

類完整代碼

<?php
class GetPingYing {
    private $pylist = array(
        'a' => -20319, 'ai' => -20317, 'an' => -20304, 'ang' => -20295, 'ao' => -20292,
        'ba' => -20283, 'bai' => -20265, 'ban' => -20257, 'bang' => -20242, 'bao' => -20230,
        // ... 完整映射表(原文含 400+ 條,此處省略) ...
        'zuo' => -10254
    );

    // 獲取全拼
    public function getAllPY($chinese, $delimiter = '', $length = 0) {
        $py = $this->zh_to_pys($chinese, $delimiter);
        if ($length) $py = substr($py, 0, $length);
        return $py;
    }

    // 獲取首字母
    public function getFirstPY($chinese) {
        $result = '';
        for ($i = 0; $i < strlen($chinese); $i++) {
            $p = ord(substr($chinese, $i, 1));
            if ($p > 160) {
                $q = ord(substr($chinese, ++$i, 1));
                $p = $p * 256 + $q - 65536;
            }
            $result .= substr($this->zh_to_py($p), 0, 1);
        }
        return $result;
    }

    private function zh_to_py($num, $blank = '') {
        if ($num > 0 && $num < 160) return chr($num);
        if ($num < -20319 || $num > -10247) return $blank;
        foreach ($this->pylist as $py => $code) {
            if ($code > $num) break;
            $result = $py;
        }
        return $result;
    }

    private function zh_to_pys($chinese, $delimiter = ' ', $first = 0) {
        $result = array();
        for ($i = 0; $i < strlen($chinese); $i++) {
            $p = ord(substr($chinese, $i, 1));
            if ($p > 160) {
                $q = ord(substr($chinese, ++$i, 1));
                $p = $p * 256 + $q - 65536;
            }
            $result[] = $this->zh_to_py($p);
            if ($first) return $result[0];
        }
        return implode($delimiter, $result);
    }
}

// 測試
$PingYing = new GetPingYing();
echo $PingYing->getFirstPY('羽泉樂隊,歌不錯-推薦'); // yqldgbc-tj
echo '<br>';
echo $PingYing->getAllPY('羽泉樂隊,歌不錯-推薦'); // yu quan yue dui , ge bu cuo - tui jian
?>

使用說明

  • getAllPY($str, $delimiter, $length):全拼,分隔符預設空格,可指定長度截取。
  • getFirstPY($str):首字母縮寫,適合生成拼音縮寫索引。
  • 編碼需為 GB2312/GBK;UTF-8 字串需先 iconv('UTF-8', 'GBK//IGNORE', $str) 轉碼。

擴展建議

  1. 加入多音字處理(需詞典庫或機器學習模型)。
  2. 支援 UTF-8 直接查找(建立 Unicode 區間映射表)。
  3. 整合到 Composer 包,支援 PSR-4 自動載入。

此類適合中文排序、搜尋提示、URL 生成等場景,輕量無依賴,易於整合。

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