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

PHP 中文轉拼音實現方案:從字符映射到現代庫選型

     編輯:PHP 相關知識

核心原理:GB2312 編碼區位碼映射

漢字在 GB2312 中按拼音排序,每個字佔 2 字節(高位 0xA1-0xF7,低位 0xA1-0xFE)。通過計算區位碼對應拼音首字母或完整拼音。

經典實現:Pinyin 類

class Pinyin {
    private static $pinyinMap = []; // 拼音 => 區位碼起始值
    
    public static function init() {
        // 完整映射表省略(約 400+ 條)
        // 格式: 'a' => -20319, 'ai' => -20317, ...
        self::$pinyinMap = [
            'a' => -20319, 'ai' => -20317, 'an' => -20304, /* ... */ 'zuo' => -10254
        ];
        arsort(self::$pinyinMap); // 降序,便於查找
    }
    
    public static function getPinyin($string, $charset = 'UTF-8') {
        if (empty(self::$pinyinMap)) self::init();
        
        if ($charset !== 'GB2312') {
            $string = iconv($charset, 'GB2312//IGNORE', $string);
        }
        
        $result = '';
        $len = strlen($string);
        for ($i = 0; $i < $len; $i++) {
            $ord = ord($string[$i]);
            if ($ord < 160) { // ASCII
                $result .= $string[$i];
            } else { // 雙字節漢字
                $q = ord($string[++$i]);
                $gbCode = $ord * 256 + $q - 65536; // 負數區位碼
                foreach (self::$pinyinMap as $py => $code) {
                    if ($code <= $gbCode) {
                        $result .= $py;
                        break;
                    }
                }
            }
        }
        return preg_replace('/[^a-z0-9]/i', '', $result);
    }
    
    public static function getInitials($string, $charset = 'UTF-8') {
        // 類似邏輯,只取首字母
        // 利用區位碼範圍直接判斷首字母 A-Z
    }
}

使用示例

<?php
require 'Pinyin.php';

$name = '張三豐';
echo Pinyin::getPinyin($name);      // zhangsanfeng
echo Pinyin::getInitials($name);    // zsf

// 數據庫關鍵字字段
$product = '蘋果手機14 Pro';
$keyword = Pinyin::getPinyin($product) . ' ' . Pinyin::getInitials($product);
// 存入 keyword 字段: "pingguoshouji14pro pg sj"
// 搜索時匹配:用戶輸 "pg" 或 "pingguo" 均可命中

現代化替代方案:Composer 库

overtrue/pinyin 使用示例

use Overtrue\Pinyin\Pinyin;

$pinyin = new Pinyin();
echo $pinyin->permalink('帶著希望去旅行'); // dai-zhe-xi-wang-qu-lv-xing
echo $pinyin->abbr('帶著希望去旅行');       // dzxwqlx
echo $pinyin->sentence('帶著希望去旅行');    // dài zhe xī wàng qù lǚ xíng (帶聲調)
echo $pinyin->convert('重慶');              // ['chongqing', 'zhongqing'] 多音字

性能優化建議

  • 映射表靜態緩存,避免重複構建
  • 大批量轉換時考慮 Swoole/RoadRunner 常駐內存
  • 搜索場景:數據庫全文索引 + 拼音字段雙重保障
  • MySQL 8.0+ 可用 CAST(... AS BINARY) 配合拼音索引

常見坑點

  1. 編碼不一致:源文件、數據庫、PHP 內部編碼必須統一(推薦 UTF-8)
  2. 多音字:簡單映射無法處理(如「長」cháng/zhǎng),需詞庫分詞
  3. 生僻字/擴展區:GB2312 只覆蓋 6763 漢字,GBK/GB18030 需擴展映射表
  4. 標點/數字/英文混排:預處理保留或過濾
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
庫特點安裝
overtrue/pinyin最流行、支持多音字、分詞、首字母、Laravel 集成composer require overtrue/pinyin
jiannei/chinese-pinyin輕量、無依賴、性能好composer require jiannei/chinese-pinyin
pinyin/pinyin基於詞庫、準確率高composer require pinyin/pinyin