# OpenCC 設計思想 OpenCC 默認的簡體到繁體轉換模式為 `s2t`。此模式的目標不是轉換為任何一個特定國家或地區實際使用的繁體中文,而是轉換為一種內部使用的中間詞彙標準層(intermediate lexical canonical form),稱為 **OpenCC 標準繁體**。 本文所稱「簡體」「繁體」「正體」「標準」等名稱,均指 OpenCC 配置與詞典中的 工程分類或轉換目標,用於描述字形、詞彙與轉換鏈路的技術分工。這些名稱不代表 OpenCC 對任何特定國家、地區、政治實體、語言政策或正字法主張的認同或否定。 ## 什麼是 OpenCC 標準繁體 OpenCC 標準繁體不是現實世界中任何一套完整的書寫規範,也不是香港、臺灣或其他地區的實際用字習慣。 OpenCC 配置名稱中的 `s`、`t`、`tw`、`hk` 是工程上的模式標記: * `s` 表示簡體中文,對應 `zh-Hans` 方向,大部分接近中國大陸現代簡化字系統(`zh-CN`),但不完全相同; * `t` 表示 OpenCC 標準繁體,是 OpenCC 內部使用的繁體中間層; * `tw` 表示臺灣正體模式,會在 OpenCC 標準繁體基礎上套用臺灣字形習慣; * `hk` 表示香港繁體模式,會在 OpenCC 標準繁體基礎上套用香港字形習慣; * 帶 `p` 的模式(如 `s2twp`、`tw2sp`)會額外加入地區慣用詞轉換。 這些標記可粗略理解為接近 `zh-Hans`、通用 `zh-Hant`、`zh-TW`、`zh-HK` 等方向,但不是 BCP 47 語言標籤,也不保證完全符合 CLDR 或某一官方標準。 OpenCC 標準繁體參考了《康熙字典》等各種歷史用法。它的設計目標是: * 優先選擇較正確或語義上較適當的形式; * 盡可能保留不同語義之間的字形區分,減少後續轉換時的歧義; * 儘可能保留後續地區轉換所需的信息; * 作為進一步轉換為香港標準、臺灣標準等模式的中間表示。 例如: * `台` 在 OpenCC 標準繁體中通常轉換為 `臺`,在臺灣模式中通常保持為 `臺`,在香港模式中則可能進一步轉換為 `台`。 * `吃` 在 OpenCC 標準繁體中某些語境可轉換為 `喫`,在臺灣、香港模式中通常進一步轉換為 `吃`。 * `才` 在 OpenCC 標準繁體中某些語境可轉換為 `纔`,在臺灣、香港模式中通常進一步轉換為 `才`。 這是因為 OpenCC 長期參考不同地區的辭書與官方標準,以決定特定模式下更適合使用哪種字形或詞形。例如: * 簡體模式(`s`)參考中國大陸《通用規範漢字表》; * 香港繁體模式(`t2hk` / `s2hk`)曾長期遵從香港教育局《香港小學學習字詞表》與《常用字字形表》等公開資料;但兩表中有少數用字與香港實際用字習慣有出入,現行用字已按 [BYVoid/OpenCC#418](https://github.com/BYVoid/OpenCC/pull/418) 的建議調整; * 臺灣正體模式(`t2tw` / `s2tw` / `s2twp`)長期參考台灣教育部《重編國語辭典修訂本》等公開辭書。 這些標準與辭書是 OpenCC 進行工程判斷時的重要依據,但 OpenCC 本身是一個轉換工具,而不是照搬某一國家或地區標準的實作。具體條目的取捨仍需同時考慮轉換準確性、歧義風險、資料維護成本,以及既有使用者對轉換結果的兼容性預期。 實際使用習慣與官方標準之間可能存在差異,OpenCC 並不試圖覆蓋所有實際寫法。 ### 為什麼使用「中間標準層」 若直接為每一對語言/地區變體建立獨立轉換規則,複雜度將隨模式數量平方增長。 若未來要支持如下模式的互轉: * 簡體中文(中國) * 簡體中文(新加坡) * 簡體中文(馬來西亞) * 香港繁體 * 臺灣正體 * 澳門繁體 若採用兩兩單獨轉換,需要維護 O(n²) 組規則。 採用中間標準層後,可將流程拆分為: ``` 地區標準簡體 ↔ OpenCC 標準繁體 ↔ 地區標準繁體 ``` 從而將規則維護成本降低為 O(n)。 例如概念上: * `s2tw` ≈ `s2t` + `t2tw` * `s2hk` ≈ `s2t` + `t2hk` * `tw2s` ≈ `tw2t` + `t2s` * `s2twp` ≈ `s2t` + 臺灣地區層(慣用詞與字形) * `tw2sp` ≈ 臺灣地區層反向(慣用詞與字形)+ `t2s` 其他模式亦可類推。 這裡的「≈」表示概念上的組合關係;實際配置文件與詞典組織方式可能有所不同。帶 `p` 的模式不是在完整轉換後再做整句改寫,而是在地區層中額外加入慣用詞詞典。 ## OpenCC 的轉換粒度 OpenCC 的轉換主要發生在: * 單字層級; * 詞彙上下文中的字詞選擇。 OpenCC 不進行: * 深層語義分析; * 整句改寫; * 習慣用語轉寫(除 `s2twp` 和 `tw2sp` 模式外)。 例如: * s2tw 不會主動將整個詞組改寫為臺灣慣用語; * s2twp 才會在 s2tw 基礎上增加慣用語詞典。 ## 詞典檔案的分工與轉換流程 OpenCC 的中文簡繁與地區轉換詞典依職責大致分為三類,各自對應轉換流程中的不同階段。 ### 簡繁通用層 `STCharacters.txt` 與 `STPhrases.txt` 負責簡體到 OpenCC 標準繁體的轉換; `TSCharacters.txt` 與 `TSPhrases.txt` 負責反向轉換。 ### 地區字形異體層 `TWVariants.txt` / `HKVariants.txt` 及其反向表,負責 OpenCC 標準繁體與 各地區繁體之間的**字形**差異,即同一個詞在不同地區使用不同字形書寫的情況。 `TWVariantsPhrases.txt` / `HKVariantsPhrases.txt` 及其反向表為詞組級補充, 用於在詞組語境下覆蓋單字層的預設轉換結果。詞組表的優先級高於單字表。 ### 地區慣用詞層 `TWPhrases.txt` 及其反向表 `TWPhrasesRev.txt`,負責地區之間使用**完全不同 詞彙**表達同一概念的情況,例如「計程車」與「出租車」。此層僅在帶 `p` 的 慣用詞模式下啟用,例如 `s2twp`、`tw2sp`。 這類條目應與地區字形異體分開維護。若只是同一詞彙在不同地區採用不同字形,應放入 `*Variants.txt` 或 `*VariantsPhrases.txt`;若是不同地區用不同詞彙表達同一概念, 才應放入 `*Phrases.txt` / `*PhrasesRev.txt`。 ### 轉換流程與優先級 各配置文件以 `conversion_chain` 串聯不同層;同一層內可用 `group` 並聯多個 詞典,`group.dicts` 中越靠前的詞典優先級越高。 簡體轉 OpenCC 標準繁體只經過簡繁通用層: ``` 輸入 └─ STPhrases STCharacters 輸出 ``` 簡體轉地區繁體先經過簡繁通用層,再經過地區層: ``` 輸入 └─ 簡繁通用層 STPhrases STCharacters └─ 地區層 XXPhrases(僅慣用詞模式,如 s2twp) XXVariantsPhrases XXVariants 輸出 ``` 例如,`s2t` 只使用 `STPhrases` / `STCharacters`;`s2tw` / `s2hk` 在此基礎上 再使用地區字形異體層;`s2twp` 則同時使用地區慣用詞層與地區字形異體層。 反向模式結構對稱,但地區層在前,簡繁通用層在後: ``` 輸入 └─ 地區層 XXPhrasesRev(僅慣用詞模式,如 tw2sp) XXVariantsRevPhrases XXVariantsRev └─ 簡繁通用層 TSPhrases TSCharacters 輸出 ``` 詞典檔案的完整說明與貢獻規範見 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 繁簡字詞對照表的收錄原則 關於地區慣用詞表的收錄標準,見 [doc/regional-phrase-criteria.md](doc/regional-phrase-criteria.md)。 OpenCC 是為電腦處理中文文本服務的轉換工具,因此詞典收錄不以某一套紙面規範為唯一邊界。只要條目有合理依據、符合對應模式定位,且有助於實際文本處理,就可以考慮收錄。 同時,繁簡字詞對照表不是純粹的規則推導表。新增或調整條目時,應優先依據可查證的語料、辭書、官方標準或既有約定俗成寫法,而不是僅憑部件類推或理論上可能存在的異體關係。轉換輸出的字形也應以主流平台通常可以正常顯示為重要標準,避免把使用者帶到缺字、無法辨識或難以後續處理的結果。 收錄時應遵循以下原則: * 必須有足夠依據證明該寫法實際存在,或在電腦處理場景中有明確用途; * 必須符合對應模式的標準層定位,例如 `STCharacters.txt` 處理的是「簡體」到「OpenCC 標準繁體」,地區異體應交由相應地區變體表處理; * 轉換輸出應優先選擇主流平台通常可以正常顯示、輸入、檢索和後續處理的字形; * 詞組通常只收錄最常用、最符合目標模式的寫法;單字在確有多個常用候選時,可以收錄多個候選; * 不應收錄會引入高風險歧義、降低候選質量,或在人工選詞場景中造成大量低價值候選的條目; * 不應僅因某個字形可以由部件類推、Unicode 關聯、或歷史異體關係解釋為繁簡關係,就自動加入轉換表; * 對既有轉換結果有影響的改動應從嚴處理,優先保證現有轉換的穩定性。 實務上,OpenCC 支援的字元多數位於 BMP 與 CJK Extension A,因為這些區段已覆蓋現代文本中的絕大多數用字。超出這些區段的字元不會僅因位於較高 Unicode plane 而被排除;若能提出明確的實際使用證據,且在主流平台上通常可以正常顯示,也可以收錄。 換言之,OpenCC 可以在有明確依據時處理一簡對多繁、一繁對多簡,或多個常用異體候選;但不以窮盡所有理論上可能的字形為目標。若某個候選主要屬於臺灣、香港、日本新字體或其他特定地區/系統,應放入相應模式或另建轉換表,而不是混入通用 `s2t` / `t2s` 字表。 ## 避免過度轉換 OpenCC 的另一個重要原則是:避免過度轉換。 當某個字或詞存在歧義,而無法可靠判定語義時,OpenCC 傾向於保持原文,而不是進行高風險轉換。 例如: * `沉` / `沈` * 某些情況下的 `干` / `幹` / `乾` * 某些情況下的 `发` / `發` / `髮` 這種設計意味著: * 某些本可轉換的情況可能不被轉換(較低 recall); * 但已發生的轉換通常具有較高可信度(較高 precision)。 這一策略可能導致部分使用者認為「轉換不完整」,但其目的在於降低錯誤轉換的概率,避免因誤判語義而產生更嚴重的錯誤結果。 ## 模式定義域與實務輸入 各轉換模式都有名義上的輸入範圍,例如 `t2s` 在設計上處理的是 OpenCC 標準繁體到 簡體的轉換。但在實務上,真實文本未必嚴格符合 OpenCC 標準繁體,因此 `t2s` 也可以 收錄部分非 OpenCC 標準繁體的常見輸入形式,以提高文本處理的可用性。 這類收錄屬於輸入兼容性考量,不表示 OpenCC 標準繁體本身的定義被擴大,也不保證所有 地區繁體或歷史異體都應直接混入 `t2s`。 ## 轉換不保證可逆 `t2s` 可視為 `s2t` 的逆方向操作,但不保證: ``` t2s(s2t(x)) == x ``` 其他模式同理。 原因包括: * 多個來源形式可能被歸一到同一 OpenCC 標準形式; * 某些轉換會丟失來源信息; * 地區標準轉換本身可能進一步合併形式。 例如: ``` 簡體 → OpenCC 標準繁體 → 地區繁體 ``` 在中間步驟中,原始信息可能已不可恢復。 ## 歷史討論 關於 OpenCC 標準繁體、演算法,與相關轉換原則,曾在多個 issue 與 pull request 中反覆討論,例如: - [#1038](https://github.com/BYVoid/OpenCC/pull/1038):以 `背` / `揹` 為例,討論 OpenCC 標準繁體如何在常見用法、官方標準與語義區分之間取捨;OpenCC 基本上仍以臺灣官方用字為重要參考,因此使用 `臺灣` 等形式,但標準繁體層的目標是盡可能選擇較正確或語義上較適當的字詞,以便後續轉換能更好地區分不同語義。 - [#475](https://github.com/BYVoid/OpenCC/issues/475):討論分詞與多階段轉換順序如何影響地區慣用詞匹配。 - [#434](https://github.com/BYVoid/OpenCC/issues/434):討論簡體側候選收錄的實用性與異體字原則,需綜合考量是否見於《通用規範漢字表》等現代大陸標準、實際使用率,以及是否只是異體字或字形類推結果;例如不宜把幾乎不出現在大陸文本中的 `馀` 輕易列為候選,也不宜僅因 `㓰` 字形可聯想到 `劃`,就將其視為 `劃` 的規範簡化字。 - [#418](https://github.com/BYVoid/OpenCC/pull/418):修正香港模式中與實際用字習慣不符的字形,並說明《香港小學學習字詞表》與《常用字字形表》不宜被機械照搬。 本文檔用於統一說明設計原則,以便後續參考。