# 聊一聊威注音輸入法 3.3.0 更新當中的某個特性 近期威注音主流版本更新至 3.3.0(且 macOS 10.9 Mavericks 專用的 Aqua 紀念版更新也跟著更新到 0.5.3),有一個重要的更新內容,就是允許在輸入法偏好設定內決定一件事情:是否**藉由**輸入法的應用程式封包(Application Bundle)目錄**以外的位置載入原廠語彙資料檔案**。 為什麼要這麼設計?因為**這是很多商業輸入法都缺失的特性之一**。筆者最開始用自然輸入法 v11 for Mac 的時候,發現在敲繁體中文時居然都能敲出那種「簡轉繁才會出現的」用字搭配錯誤。自然輸入法肯定是在很多功能方面比 macOS 內建的注音更優秀的(至少辭典編輯沒那麼痛苦),但原廠詞庫沒辦法自己換掉,就只能放棄考慮。然後呢?奇摩注音的原廠詞庫是塞在輸入法的 Binary Executive 裡面的,也無法做針對更新。 從 macOS 10.15.4 開始,Apple 對來自 Mac App Store 以外的渠道的應用程式有著 Notarization 公證處理的要求,且 macOS 內建的 GateKeeper 門衛體系會對無法滿足這種要求的應用百般刁難、非得讓使用者多幾個麻煩的步驟才可以正常用這種軟體。這種設計是雙刃劍,先不多討論。但有一個事實因此而既定:**任何藉由「針對輸入法的 App Bundle 本身的修改」而成的軟體資料更新手段,均已不再適用**。 與此同時,因為諸多原因,筆者這邊是打算在威注音 4.0 或 5.0 開始來一次重寫、以盡量減少對 AppKit 的依賴(但不會(也無法)完全割除這種依賴)。經過這幾個月以來對 macOS 10.15 開始至今的系統的相容性體驗的考量,筆者這邊暫時計畫讓威注音 4.0 或 5.0 僅支援 macOS 12 Monterey 開始的系統。那麼,在使用 macOS 10.9-10.12 的威注音 Aqua 紀念版的使用者們、以及在 macOS 10.13 至今的系統下使用目前威注音 3.x 主流版本的使用者們,他們屆時該用怎樣的手段用上最新的語料庫、而不至於讓筆者非得發行新的對應的相容版本?發行新版本需要使用有效的 Apple Developer 會員身分、以便給 App Bundle 做數位簽章+公證處理,這年度會員費用也絕不便宜。 綜上所述,筆者在威注音 3.3.0(及其 Aqua 紀念版 0.5.3)當中引入了這個新特性。如果啟用了該特性的話,則威注音會優先嘗試讀取+利用下述目錄內的既存的可用的原廠辭典檔案(俗稱 Container 辭典目錄): ``` /Users/使用者名稱/Library/Containers/org.atelierInmu.inputmethod.vChewing/Data/Library/Application Support/vChewingFactoryData/ ``` 會讀取這些檔案: ``` data-bpmf-reverse-lookup-CNS1.plist // 全字庫反查表分卷1 data-bpmf-reverse-lookup-CNS2.plist // 全字庫反查表分卷2 data-bpmf-reverse-lookup-CNS3.plist // 全字庫反查表分卷3 data-bpmf-reverse-lookup-CNS4.plist // 全字庫反查表分卷4 data-bpmf-reverse-lookup-CNS5.plist // 全字庫反查表分卷5 data-bpmf-reverse-lookup-CNS6.plist // 全字庫反查表分卷6 data-bpmf-reverse-lookup.plist // 核心字音庫反查表 data-chs.plist // 簡體中文核心語彙庫 data-cht.plist // 繁體中文核心語彙庫 data-cns.plist // 全字庫語彙庫(不支援反查) data-symbols.plist // 原廠符號語彙庫(包括少數 Emoji 支援) data-zhuyinwen.plist // 原廠注音文語彙庫 ``` 由於 plist 的漢字資料都是用 UTF-16 記錄的、比 UTF-8 肥,所以在部分 plist 當中使用 Data 來寄存 UTF-8 原始資料、會在讀取時就地解讀。同樣是為了節約檔案體積,所有核心語彙庫的注音索引也都做了可逆的淺加密處理:每個注音符號對應一個 ASCII 字元。 對上述檔案的生成過程感興趣者,可以參考 [libvChewing-Data](https://github.com/vChewing/libvchewing-data) 的 `bin/cook_mac.swift` 檔案。威注音輸入法主倉庫內的 `DataCompiler/dataCompiler.swift` 理論上來講也是雷同的檔案,且威注音輸入法在建置時會優先使用該檔案。 ![](https://i.imgur.com/sr05rJF.png) 剩下的值得一講的內容就沒多少了,無非是在輸入法的語言模組總成組件當中修改檔案讀取機制:根據使用者偏好設定來決定是否優先讀取 Container 辭典目錄內的檔案,且會在發現檔案不存在的時候自動改為讀取輸入法 App Bundle 內的原廠辭典檔案。 $ EOF.