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

PHP 漢字轉拼音:UTF-8/GBK 雙編碼支援完整實現

     編輯:PHP 相關知識

功能概覽

提供三個核心函數實現中文轉拼音:

  • utf82gb($utfstr):UTF-8 → GBK
  • SpGetPinyin($str, $ishead=0, $isclose=1):GBK 字符串 → 拼音(全拼/首字母)
  • getPinyin($string):UTF-8 直接轉拼音(組合上述兩函數)

核心實現細節

1. UTF-8 轉 GBK (utf82gb)

  • 優先使用 iconv()(高效、標準)
  • 無 iconv 時加載映射表 gb2312-utf8.table 手動轉換
  • 逐字節解析 UTF-8 多字節序列,查表轉換
  • 無法轉換的字符輸出 &#代碼; 實體

2. GBK 轉拼音 (SpGetPinyin)

  • 加載 pinyin.db 映射文件(格式:區位碼 拼音)
  • 按雙字節遍歷字符串,高字節 > 0x80 視為漢字
  • 查表獲取拼音,$ishead=1 時只取首字母
  • 非漢字字符(字母、數字)保留,其它替換為下劃線

3. 映射文件格式示例

# gb2312-utf8.table
000000 000000
...
# pinyin.db
B0A1 a
B0A2 ai
B0A3 an
...

使用示例

echo getPinyin("中國WEB第一站");
// 輸出:zhongguowebdiyizhan (全拼)
// 或 getPinyin("中國", 1) → zg (首字母)

優缺點分析

優點

  • 無外部擴展依賴(可選 iconv)
  • 支援 UTF-8/GBK 雙編碼輸入
  • 可選全拼/首字母模式
  • 代碼結構清晰,易於理解

不足

  • 多音字不支援:單一映射,無法處理「行」(hang/xing)、「長」(chang/zhang) 等
  • 映射表維護困難:需手動更新 .table、.db 文件
  • 性能一般:PHP 層面逐字節解析、查表,大量文本較慢
  • 編碼處理脆弱:手寫 UTF-8 解析易出錯,不如 mbstring/iconv 可靠

現代替代方案

1. Composer 包(推薦)

composer require overtrue/pinyin
// 使用
use Overtrue\Pinyin\Pinyin;
$pinyin = new Pinyin();
echo $pinyin->permalink('帶英雄氣的男兒'); // dai-ying-xiong-qi-de-nan-er

2. PHP 內置 Transliterator (intl 擴展)

$t = Transliterator::create('Any-Latin; Latin-ASCII');
echo $t->transliterate('中國'); // Zhong Guo

3. 專業庫對比

庫多音字分詞性能維護
overtrue/pinyin✓ (詞典)✓高活躍
jiannei/laravel-pinyin✓✓高活躍
pinpin/pinyin✗✗中一般

應用場景建議

  • URL slug 生成 → 專業庫 + 自定義分隔符
  • 搜索首字母索引 → 首字母模式 + 緩存
  • 內部工具、數據遷移一次性腳本 → 本代碼可接受
  • 高併發生產環境 → 必須用 C 擴展庫或預計算存庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved