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

PHP UTF-8 環境下繁簡中文轉換類實作

     編輯:PHP 相關知識

繁簡轉換核心原理

繁簡轉換本質是「字元級對應替換」。UTF-8 編碼下,每個漢字佔 3 位元組,需建立完整的「繁體→簡體」或「簡體→繁體」字元對照表,逐字元替換。

完整轉換類實作

<?php
/**
 * UTF-8 繁簡轉換器
 * 支援雙向轉換:繁轉簡 (tc2sc)、簡轉繁 (sc2tc)
 */
class ChineseConverter {
    private $tc2sc_map = [];
    private $sc2tc_map = [];
    
    public function __construct() {
        // 核心對照表 (節選,完整表需包含常用 5000+ 字)
        $traditional = '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冂冂冂';
        $simplified = '万与丑专业丛东丝丢两严丧个丰丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵咀亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣优优侧侨伺侪侬俩俦俨俩俪俭债倾僂僾偿倜伉储诺儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击氹凿刍划刘则刚创删除别剗剄劊劌剴剂剮剑剥剧劝办务勱动励劲劳势勋猛勉匀匮匮区医华卖卖卢卤卧卫却巹厂厅历厉压厌厕厕厅厦厨厩厝县参靉靆双发变叙叠叶号叹唰吁后吓吕吗吣吨听启吴呜呸呕嚦呗员咼嗆嗚咏咔嚨咛咝吒噅咸呱响哑哒嘵嗶哕哗噲嚌噥喲唛唝唠唡唢唣唤唿啧啬啭啮啰啸嚯嚄团园囱围圉国图圆圣坛场坂坏块坚坛坝坝塢墳坠陇陇垄垄垒垦垲垲墊墊垵塹堕墙墙壮声壳壶瓮处备复够头夸夹奁奂奋奖奥妆妇妈媚嫗媯姗姜娄娅娆娇娈娱娲娴婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层层届属屡履屿岁豈崎岗峴岘岚岛岭岳嵋嵘嵚嵛嵝嵎嵕嵝嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵩嵪嵫嵬嵭嵮嵯嵰嵱嵲嵳嵴嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿巅巩巯币帅师帏帐帘帜带帧帮帱帽帼幂幂幂';
        
        // 建立雙向映射 (UTF-8 字元陣列)
        $tc_arr = $this->utf8_to_array($traditional);
        $sc_arr = $this->utf8_to_array($simplified);
        
        foreach ($tc_arr as $i => $char) {
            if (isset($sc_arr[$i])) {
                $this->tc2sc_map[$char] = $sc_arr[$i];
                $this->sc2tc_map[$sc_arr[$i]] = $char;
            }
        }
    }
    
    // UTF-8 字串轉字元陣列
    private function utf8_to_array($str) {
        $arr = [];
        $len = strlen($str);
        for ($i = 0; $i < $len; $i++) {
            $c = ord($str[$i]);
            if ($c < 0x80) { // ASCII
                $arr[] = $str[$i];
            } elseif (($c & 0xE0) === 0xC0) { // 2 bytes
                $arr[] = substr($str, $i, 2);
                $i++;
            } elseif (($c & 0xF0) === 0xE0) { // 3 bytes (中日韓)
                $arr[] = substr($str, $i, 3);
                $i += 2;
            } elseif (($c & 0xF8) === 0xF0) { // 4 bytes (Emoji等)
                $arr[] = substr($str, $i, 4);
                $i += 3;
            }
        }
        return $arr;
    }
    
    // 繁體轉簡體
    public function tc2sc($text) {
        return $this->convert($text, $this->tc2sc_map);
    }
    
    // 簡體轉繁體
    public function sc2tc($text) {
        return $this->convert($text, $this->sc2tc_map);
    }
    
    private function convert($text, $map) {
        $arr = $this->utf8_to_array($text);
        foreach ($arr as &$char) {
            if (isset($map[$char])) {
                $char = $map[$char];
            }
        }
        return implode('', $arr);
    }
}

// 使用範例
$converter = new ChineseConverter();
echo $converter->tc2sc('繁體中文測試'); // 繁体中文测试
echo $converter->sc2tc('简体中文测试'); // 簡體中文測試
?>

效能優化建議

  • 靜態快取對照表:將對照表序列化存檔,避免每次實例化重建
  • Trie 樹/AC 自動機:大量文本轉換時,多模式匹配優於逐字元查找
  • 分詞優先:結合分詞庫 (如 Jieba) 詞級轉換,解決一簡對多繁歧義 (如「發」→「發射/頭髮」)
  • 擴展套件:生產環境建議使用 opencc (Open Chinese Convert) C 擴展,效能更優、詞庫更完整

注意事項

  1. 純字元映射無法處理語境相關轉換 (如「皇后/后天」)
  2. 地區用語差異 (台灣/香港/大陸) 需額外詞表
  3. 標點符號、數字、英文通常保持不變
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved