·
7 commits
to master
since this release
2026年8月22日
- 發佈重點:轉換熱路徑大幅加速(純文字語料的整體轉換時間最多降至原本的 1/7),修復大端序平台載入 legacy
.ocd字典得到空字典的問題,並新增兩個實驗性 API(詞級候選查詢與一對多歧義標註,含 CLI--ambiguities)。詞庫方面修正了s2twp的數處貪婪匹配錯誤與tw2t/tw2s對簡體「么」的破壞性轉換,補充臺灣/香港地區詞,並修正古籍語境下s2t的一對多字用字。C++ ABI 與 1.4.1 相同(SOVERSION 1.4),實驗性 API 皆位於未安裝的私有標頭或巨集開關之後,下游程式無需重新連結。 - 詞庫更新:
- 修復
tw2t/tw2s/tw2sp會把已是簡體的「什么」轉成「什幺」的問題:生成的TWVariantsRev含么 -> 幺(臺灣標準幺 -> 么的反向),在TWVariantsRevPhrases.txt補上「什么/怎么/这么/那么/多么/要么/好么/甚么」等例外映射至「麼」形,同時保留「老么 → 老幺」等真正的 yao1 詞(#1469, #1473)。 - 修復
s2twp因較短詞條先命中而拆錯詞的問題:補上「互联网络」「快闪存储器」「老挝人民民主共和国」的完整詞條,並將「老撾人民民主共和國」對應到臺灣官方譯名「寮人民民主共和國」(#1467, #1468)。 - 「梁/樑」:新增臺灣地區用字映射與人名、地名保護詞條(#1407);並將
TWVariantsRevPhrases與STPhrases對齊,補上 41 條梁(棟梁義)的反向詞組映射,使tw2t能從上下文還原「橋樑」而不誤傷姓氏、地名(#1424)。 - 新增奧斯卡最佳導演與最佳影片製片人的臺灣/香港譯名詞條(取自中文維基百科
NoteTA地區詞表並以 Wikidata 交叉核對,僅收錄真正存在音譯差異者,如 卡梅隆/卡麥隆/金馬倫)(#1466)。 - 新增地區詞「內存條 → 記憶體模組」(
s2twp/s2hkp,含反向詞條)(#1475)、「数字人文 → 數位人文」(s2twp/tw2sp)(#1465)。 s2t:修正古籍語境下一對多字的用字。征/咸/斗/里/范/岳/冲/郁/谷在STPhrases沒有對應詞條時會退回STCharacters,而那裏的候選次序是按現代用法排的,碰上文言文和書名就常常選錯。此次按義項補入詞條:征伐義(征南、从征实录)、年號與副詞義(咸淳、少长咸集)、星宿義(斗姆、东斗星君)、地名與音譯(甫里、摩里支)、姓氏義(范文正、岳武穆)、道教與梵語音譯(道冲、郁迦罗越);谷神改為保留「谷」(《老子》「谷神不死」),谷神星則因鍵更長,仍映射為「穀神星」。這批問題是在清理殆知閣文獻時發現的,該批書名中 47 條誤轉修正了 46 條,現代語義的轉換一律不受影響(#1479)。s2t:「小丑」不再預設轉換為「小醜」(#1423);「雇」改為STCharacters中「僱」以外的非預設候選(#906);新增「这周/那周/若干周/几周/周线 → 週」等指示與量化用法,並補上「周围/周边/周遭」的分詞保護詞條(#1428);新增顯式詞條「复盘 → 復盤」,使其不再只依賴复的候選順序(#1427)。t2s:修正過度轉換「乾斷食 → 干断食」「乾紅 → 干红」(#621, #1429)。- 修正「鑒」相關詞條與若干提稱語,如「郝铭鉴 → 郝銘鑒」(#1421)。
- 修復
- 效能:
- 轉換熱路徑跳過不可能匹配的字元區段:
PrefixMatch在建構時建立 key 起始字元表並提供SkipUnmatchable(),讓Conversion::AppendConverted與MaxMatchSegmentation一次消化整段不可能作為詞條開頭的字元(ASCII、標點、emoji 以及不作為任何 key 開頭的漢字),取代逐字元的 trie 查詢。過濾以精確碼位而非 UTF-8 首位元組進行(0xE4..0xE9這些常見漢字首位元組幾乎都有 key,按首位元組只能跳過約 10%,按碼位則有 69–76% 的位置不匹配任何 key)。22 MB 繁體語料的整體 CLI 時間(含字典載入):t2s3.40s → 0.52s、t2tw3.43s → 0.30s、s2twp8.40s → 4.86s;4 MB 中英混合語料的t2s0.83s → 0.11s。啟動時間、最大 RSS 與缺頁次數不變,轉換輸出逐位元組不變(以對照逐字元參考實作的差分 fuzz 測試保證)(#1464)。
- 轉換熱路徑跳過不可能匹配的字元區段:
- 實驗性 API / CLI:
- 新增 librime 風格的詞級候選查詢
Converter::GetConversionCandidates,列舉單一詞經整條轉換鏈後的所有形式(如s2t的里展開為里、裏)。該 API 以OPENCC_ENABLE_UNSTABLE_API巨集開關隔離,不進入已安裝標頭與OPENCC_ABI_VERSION契約;成員刻意設為非虛擬,開啟巨集不改變Converter的 vtable(#1431)。 - 新增一對多歧義標註與 CLI
--ambiguities模式:轉換結果與Converter::Convert完全一致,同時標出每一個字典匹配為一對多的輸出區段(如STPhrases的文丑 -> 文丑 文醜、TSCharacters的鍾 -> 钟 锺),呼叫方可據此定位歧義位置並按需以GetAllConversions取得候選。檔案輸入輸出 JSONL 記錄且記憶體用量有界,互動式 stdin 則逐行輸出 JSON 封包。實作位於未安裝的私有標頭,不改變已安裝標頭與 ABI,轉換熱路徑不受影響(#1461, #1462)。
- 新增 librime 風格的詞級候選查詢
.ocd字典格式:- Node.js:
- npm 套件的源碼編譯 fallback 從 node-gyp 改為 Bazel:原生 addon 優先透過
@opencc/opencc-<platform>-<arch>預編譯 scoped 套件安裝(涵蓋 macOS x64/arm64、Linux x64/arm64、Windows x64,均以 Bazel 構建,字典隨包預編譯);沒有預編譯二進位套件的平台,npm install會以 Bazel 完整地從源碼構建——編譯//node:opencc並重新生成字典(bazel/bazelisk取自 PATH,或經npx自動下載 bazelisk;字典生成腳本的 Python 由 Bazel hermetic 工具鏈提供)。binding.gyp與.gypi構建定義刪除,node-gyp、node-gyp-build、node-addon-api、prebuildify依賴與prebuildnpm script 一併移除;tarball 不再攜帶deps/(C++ 三方依賴改由 Bazel Central Registry 提供),改為攜帶 Bazel workspace、src/C++ 源碼與data/字典源檔(#1426, #1430)。 - CI 測試任務、Makefile target 與源碼 checkout 的開發構建一併改用 Bazel,與 npm 發佈所用的構建路徑一致;Windows CI 任務移至
windows-2025-vs2026(#1426)。
- npm 套件的源碼編譯 fallback 從 node-gyp 改為 Bazel:原生 addon 優先透過
- 打包 / 構建系統:
packaging/debian/同步至 Debian 的1.4.1+ds1-8。Debian 已採納上游先前提出的 jieba 插件打包提案(拆為opencc-jieba與 arch:all 的opencc-jieba-data兩個套件,內嵌 cppjieba 的理由記於debian/README.source);Debian 端亦重新啟用了 autopkgtest。packaging/debian/SPLIT_PROPOSAL.md隨提案落地移除。另外1.4.1+ds1-8修復了.ocd2被放進Architecture: all套件的問題:.ocd2是依主機位元組序寫出的 marisa-trie 映像,所有架構都會拿到 arch:all buildd 上構建的小端序副本,opencc 在 s390x 上因而以size > avail_失敗(Debian bug #1145010,由重新啟用的 s390x autopkgtest 揪出)。*.ocd2已移回 arch:any 的libopencc1.4、jieba_merged.ocd2移回 arch:any 的opencc-jieba;libopencc-data與opencc-jieba-data現在只含 JSON 配置與純文字 jieba 詞典來源。- Debian 套件構建改在
debian:sid容器中進行(同步來的打包以 unstable 為目標,Ubuntu LTS runner 無法滿足),並在dpkg-buildpackage前套用debian/patchesquilt series(自動跳過已在樹中的補丁);arm64 改用ubuntu-24.04-armrunner 原生構建,取代先前的交叉構建(#1420)。 - 新增
packaging/freebsd/:FreeBSD ports treechinese/opencc條目的參考副本,供上游審閱與準備提交給 port maintainer 的改動。 - 新增精簡 C++ 源碼包發佈流程(
release-source.yml):以OPENCC_SOURCE_PACKAGE_PROFILE=opencc產生僅含 C++ 核心的 CPack 壓縮包(不含 Node.js、Python、文檔、packaging 與 plugins),並以 CMake 與 Bazel 雙路徑冒煙測試後上傳至 draft release;為此保留 Bazel workspace 檔案與頂層patches/,僅排除可能含 API key 的.bazelrc.user。 - 修正
cmake/GitVersion.cmake的 fallback 版本號:1.4.1 發佈時仍停留在 1.4.0,導致從釋出的 tarball(無 git 資訊)構建時版本回報為 1.4.0;本次發佈同步將其更新至 1.4.2,並讓scripts/compute-version.sh的 fallback 與之一致(先前停留在 1.2.1)。因此 Debian 打包的0010-fix-git-version-fallback.patch對 1.4.2 已無作用而移除,0012-fix-legacy-dict-detection-on-big-endian.patch亦已包含於本次發佈。 - Windows 發佈自本版起啟用程式碼簽章憑證:可攜式 CLI 壓縮包中的執行檔,以及 win32-x64 npm 二進位(
opencc.node、opencc-jieba.dll)皆經 Authenticode 簽章,簽章服務由 SignPath.io 免費提供、憑證由 SignPath Foundation 免費提供,發佈流程改用其 release-signing policy;相關聲明與簽章/隱私政策見 README 的「Code Signing 程式碼簽章」一節(#1458, #1459)。
- 測試:
PrefixMatchTest改用測試專屬的字典檔名,避免與MarisaDictTest在共享工作目錄下爭用同一個dict.ocd2,該競爭會使並行 ctest(如dh_auto_test的ctest -j8)偶發失敗。