如何製作 Windows 10 微軟拼音格式的詞庫?

Window 10紅石更新後,輸入法增加導入「用戶自定義短語」功能

但是,其並不支持文本詞庫。

參考下面文章後,我仍然不清楚如何製作微軟拼音格式的詞庫。

Windowns 10 周年更新後的 ChsPinyinUDP.lex 逆向工程

請問:如何製作 Windows 10 微軟拼音格式的詞庫?

搞不定就去給微軟提建議吧,用IE或Edge打開下面鏈接:

feedback-hub:?contextid=330feedbackid=4347f5b5-08ec-47c1-b151-c4d8a537c738form=1src=2


  • RS1里的這個「用戶自定義短語」功能用來逐條手動添加自定義短語的。已添加的自定義短語可以導出(保存到文件),已導出至文件的自定義短語可以被導入
  • 基於txt文件生成用戶詞典的功能目前正在開發
  • 自定義雙拼方案也在開發中


經過測試,

Bing輸入法導出的默認txt格式的詞庫導入失敗;

QQ輸入法導出的txt格式的詞庫導入時無響應,不清楚有沒有成功;

搜狗的加密bin詞庫我就沒試(早就卸載了,電腦還留著以前的詞庫備份),肯定沒戲;

Google拼音輸入法導出的Dic(其實就是txt換了個後綴)詞庫,導入失敗;

小小輸入法的個人詞庫txt文件,導入失敗;

中州韻輸入法導出txt文件詞庫,之後導入微軟拼音,失敗……

而且不告訴你為什麼失敗……

你特么是在逗我?!!

也許用以前Office裡頭帶的微軟拼音2007、2010、2012等輸入法的詞庫可以直接導入?!問題是現在誰沒事還用這個垃圾輸入法啊,你Win10把好多輸入法折騰的根本不能用,影響最大的就是你的微軟拼音自己不知道啊?

最牛的是,從Win10內測開始我就在一個勁兒反饋的——

開放雙拼自定義鍵盤布局,或者允許自己導入第三方雙拼編碼的功能,到現在依舊——

木有……

Fuck!


深藍詞庫轉換法已經可用。studyzy/imewlconverter 但是詞序問題很難解決,建議大家轉換詞庫時設置詞頻過濾,詞頻大點,可防止輸入法連基本的單字都亂序。


這個導入詞庫功能很難嗎?不就是一個for循環嗎?


其實也沒那麼難,研究了6個多小時,把百度輸入法備份的自定義短語導進來了。除了0020-0023是什麼沒有搞明白,其他的都清楚了。我得睡一會兒,明天又精力了再回答。

先把代碼貼上來

Sub WF()
Dim N As Long
Dim TN As Integer
Dim TB As Byte
Dim WordCount As Long
Dim FileLength As Long
Dim WordLength() As Integer
Dim WordOrder() As Byte
Dim WordCode() As String
Dim WordMean() As String
Dim StringByte() As Byte
WordCount = 0
FileLength = H40
Open "I:My Documents常用個人自定義短語導出1.txt" For Binary As #2
Seek #2, 3
WordCount = 0
Do
Get #2, , TN
ReDim Preserve WordOrder(WordCount)
ReDim Preserve WordLength(WordCount)
ReDim Preserve WordCode(WordCount)
ReDim Preserve WordMean(WordCount)
WordOrder(WordCount) = TN - H30
Seek #2, Seek(2) + 2
I = 0
Do
DoEvents
Get 2, , TB
If TB = H3D Then Exit Do
ReDim Preserve StringByte(I)
StringByte(I) = TB
I = I + 1
Loop
WordCode(WordCount) = StringByte
FileLength = FileLength + I + 2
Do
Get #2, , TB
Loop Until TB = H7D
Seek 2, Seek(2) + 1
I = 0
Do
DoEvents
Get #2, , TB
If TB = HD Then Exit Do
ReDim Preserve StringByte(I)
StringByte(I) = TB
I = I + 1
Loop While Seek(2) &<= LOF(2) WordMean(WordCount) = StringByte FileLength = FileLength + I + 2 FileLength = FileLength + 8 Seek 2, Seek(2) + 3 If Seek(2) &> LOF(2) Then Exit Do
WordCount = WordCount + 1
DoEvents
Loop
Close #2
FileLength = FileLength + (WordCount + 1) * 4
S = StrConv("mschxudp", vbFromUnicode)
Open "H:T" For Binary As #1
For I = 1 To LenB(S)
Put #1, , AscB(MidB(S, I, 1))
Next
N = 1
Put #1, , N
N = H40
Put #1, , N
Put #1, , H40 + (WordCount + 1) * 4
Put #1, , FileLength
Put #1, , WordCount
N = 0
For I = 1 To 9
Put #1, , N
Next
N = 0
For I = 0 To WordCount
Put #1, , N
N = N + LenB(WordMean(I)) + LenB(WordCode(I)) + 12
Next
N = H80008
TB = H6
For I = 0 To WordCount
Put #1, , N
TN = LenB(WordCode(I)) + 10
Put #1, , TN
Put #1, , WordOrder(I)
Put #1, , TB
StringByte = WordCode(I)
Put #1, , StringByte
Put #1, , 0
StringByte = WordMean(I)
Put #1, , StringByte
Put #1, , 0
Next
Close #1
End Sub


我把導出的詞庫文件f打開,複製粘貼到下面,另外根據分析標記了顏色。

文件是用微軟拼音自定義短語的導出功能導出的文本文件myeudp.

導出了多個文件,第一行都是相同的。1000-10003是指字型檔的起始位置,截圖中是58。1004-1007是結束位置。0020-0023是我始終沒有搞明白的欄位,這個數字隨著詞庫的增加有變化,但不是一直增加。0024-0043是兩個空行,增加詞庫這兩行都是一樣的。

0018-001B是詞條的數量。

0044-0057詞庫增加一條,就增加4個位元組,因為這個有6個自造詞,所以是5段。這個是相對於起始位置的偏移量。

每個詞條都是以08000800開始,緊跟著的4個位元組,第一個似乎和長度有關,字詞越長,這個越大,第二個是分割,第三個是指自定義詞在候選框的位置,第四個都是06。以0000結束,拼音和漢子之間有0000分割。字母2個位元組,高位為00.

這個文件我看了2-3天,也只能分析到這裡了。0020-0023是什麼沒有搞明白。再者是緊跟08000800的那個數字是什麼意思。想搞明白是為了批量導入一些常用詞,加快專用詞常用詞的輸入。現在暫時擱置一下吧,我實在是想不明白了。

Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000: 6D 73 63 68 78 75 64 70 01 00 00 00 40 00 00 00

00000010: 58 00 00 00 F8 00 00 00 06 00 00 00 00 00 00 00

00000020: F6 A6 E8 58 00 00 00 00 00 00 00 00 00 00 00 00

00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00000040: 00 00 00 00 22 00 00 00 44 00 00 00 5C 00 00 00

00000050: 74 00 00 00 88 00 00 00 08 00 08 00 14 00 01 06

00000060: 63 00 70 00 78 00 6D 00 6A 00 00 00 0C 83 73 5E

00000070: BF 53 5C 75 67 72 40 5C 00 00 08 00 08 00 12 00

00000080: 01 06 63 00 70 00 79 00 7A 00 00 00 0C 83 73 5E

00000090: BF 53 2C 7B 00 4E 2D 4E 66 5B 00 00 08 00 08 00

000000a0: 10 00 01 06 67 00 79 00 79 00 00 00 ED 90 09 61

000000b0: A6 60 00 00 08 00 08 00 10 00 02 06 68 00 6C 00

000000c0: 6A 00 00 00 DD 90 99 9F CA 4F 00 00 08 00 08 00

000000d0: 0E 00 01 06 68 00 70 00 00 00 DD 90 4F 9E 00 00

000000e0: 08 00 08 00 10 00 01 06 7A 00 77 00 66 00 00 00

000000f0: 20 5F 87 65 30 4E 00 00

導入失敗的原因是現在只能支持二進位文件導入,以前的是純文本。現在在網上搜索到是文本詞典的編輯方法。據說雙拼自定義鍵盤的功能也在開發中。

我有一堆人名輸入,想用批量導入,卻找不到工具。我也看了那個關於C:WindowsInputMethodCHS的ChsDoublePinyinUDP.lex逆向工程的文章。文件太大,不容易判斷,後來我用VScode打開導出的txt文檔,提示是二進位文件。

安裝了hexdump for vscode可以顯示了。然後用用戶自定義短語工具輸入然後導出分析myeudp.txt。現在看來,輸入的短語會進行排序,拼音和候選窗的位置的,都很容易的找到了。

00 00 08 00 08 00 10 00 03 06

每段拼音的前面都是上面一段數字。03應該是候選窗的位置。其他的都沒有搞清楚。

我把做過的提供上了。編碼是Unicode,低位在前。

另外我在微軟拼音的博客上還是那裡,看到似乎正在開發批量導入的功能,但是不知道什麼時候能實現。


推薦閱讀:

有哪些新生代沒見過或者無法理解的 Windows 95/98 時代的事情?
windows本身集成很多軟體,只有瀏覽器被告壟斷,而其他軟體沒有。為什麼?比如開始菜單,計算器,播放器等。
為什麼手機內存不如電腦的內存?
c++怎麼在動態鏈接庫里使用string類?
windows 內存分配的極限?

TAG:MicrosoftWindows | 輸入法 | 詞庫 | 微軟拼音輸入法 | Windows10 |