背景
新世紀(jì)版五筆字型輸入法,簡(jiǎn)稱新世紀(jì)五筆丛晌,是王永民教授于2008年1月28日推出的第三代五筆字型輸入法(第一代的86五筆和第二代的98五筆分別于1983年和1998年推出),該版本也被稱為標(biāo)準(zhǔn)版王碼五筆稚晚。新世紀(jì)五筆建立在新的字根鍵位體系绎巨,重碼實(shí)用頻度降低,取碼更加規(guī)范砾省,打字更加順手鸡岗,在規(guī)律性、易學(xué)性等方面有顯著的進(jìn)步编兄。
優(yōu)點(diǎn)非常多但目前很多輸入法軟件默認(rèn)還不支持新世紀(jì)五筆轩性,特別是mac系統(tǒng)上的支持更慢一些。我目前主要使用清歌輸入法狠鸳,這個(gè)默認(rèn)可以切換86和98的詞庫(kù)揣苏,也支持自定義詞庫(kù)悯嗓。網(wǎng)絡(luò)上找到的大部分新世紀(jì)詞庫(kù)只有主詞庫(kù),沒(méi)有反查功能卸察,新世紀(jì)中為了輸入的方便性很多字的拆分方式和按鍵都有變化不能反查真的很不方便脯厨。
鑒于此種尷尬情況,我們是否可以自己生成反查詞庫(kù)呢坑质?當(dāng)然是可以地合武!
ciku.jpg
思路
首先可以查看系統(tǒng)自帶的主詞庫(kù)是這樣的:
a 工
aaaa 工 恭恭敬敬
aaad 工期
aaae 黃花菜
aabg 草草了事
aahg 工卡
aahh 工頻 茞 茝
aaif 葡萄汁
aaii 落花流水
aaip 工黨
aais 葡萄酒 戒酒
一行一條數(shù)據(jù)前面是輸入碼后面是可以輸入的文字 空格分割。
然后可以查看系統(tǒng)自帶的反查詞庫(kù)如下:
? rnu
? nvyy
? vnu
? ncyy
? nny
? naht
? nrry
? nwvt
? nfg
也是一行一條數(shù)據(jù)洪乍,但前面是文字結(jié)果后面對(duì)應(yīng)的碼眯杏。
那根據(jù)主詞庫(kù)生成反查詞庫(kù)是不是很清晰了:
- 讀取主詞庫(kù)內(nèi)容
- 根據(jù)換行符和空格符分割數(shù)據(jù)為數(shù)組
- 遍歷數(shù)組生成一個(gè)文字對(duì)應(yīng)一個(gè)碼
- 結(jié)果寫(xiě)入文本文件生成反查詞庫(kù)
功能實(shí)現(xiàn)
use std::fs::File;
use std::io::prelude::*;
// 源文件絕對(duì)路徑
const SOURCE_FILE: &'static str = "/Users/aqrun/xxx/新世紀(jì)五筆詞庫(kù).txt";
// 目標(biāo)文件絕對(duì)路徑
const DIST_FILE: &'static str = "/Users/aqrun/xxx/新世紀(jì)五筆反查詞庫(kù).txt";
// 測(cè)試用開(kāi)關(guān)控制待處理數(shù)據(jù)量
const TOTAL: i32 = 100;
// 是否開(kāi)啟控制開(kāi)關(guān)
const LIMIT: bool = false;
fn main() {
// 獲取源文件句柄 file
let mut file = File::open(SOURCE_FILE).expect("源文件打開(kāi)失敗,請(qǐng)檢查文件路徑");
let mut source_data = String::new();
// 讀取源文字內(nèi)容到 source_data
file.read_to_string(&mut source_data).expect("源文件內(nèi)容讀取失敗");
// 生成結(jié)構(gòu)化數(shù)據(jù)
let res = generate_data(&source_data);
// 根據(jù)結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)為最終文件內(nèi)容
let dist_data = generate_file_content(&res);
// 獲取目標(biāo)文件句柄
let mut dist_file = File::create(DIST_FILE).expect("目標(biāo)文件創(chuàng)建失敗壳澳,請(qǐng)檢查路徑");
// 寫(xiě)入內(nèi)容
dist_file.write_all(&dist_data.as_bytes()).expect("文件寫(xiě)入失敗");
// println!("{:?}", dist_data);
println!("轉(zhuǎn)換完成! 共處理{}條數(shù)據(jù)岂贩!", res.len());
}
/**
* 將源數(shù)據(jù)字符串轉(zhuǎn)換為結(jié)構(gòu)化的數(shù)組數(shù)據(jù)
*/
fn generate_data(source: &str) -> Vec<Vec<String>> {
// println!("{:?}", source);
// 保存所有數(shù)據(jù) 按行分割原始內(nèi)容為數(shù)組
let line_data_arr: Vec<&str> = source.split('\n').collect();
// 保存最后的結(jié)果
let mut res: Vec<Vec<String>> = Vec::new();
let mut index = 0;
for i in line_data_arr.iter() {
index += 1;
// 測(cè)試用控制開(kāi)關(guān)
if LIMIT && index > TOTAL {
break;
}
if i.is_empty() {
continue;
}
// 按空格分割當(dāng)前行字符串為數(shù)組
let all_arr: Vec<&str> = i.split(" ").collect();
// 當(dāng)前行數(shù)據(jù)大小
let len = all_arr.len();
// 當(dāng)前行字符編碼
let code = all_arr[0];
for j in 1..len {
// println!("{:?}, {}, {}, {}", all_arr, len, j, len-2);
// 將當(dāng)前行生成為 [編碼, 文字] 數(shù)組格式 一行一個(gè)文字
let mut res_line: Vec<String> = Vec::new();
res_line.push(all_arr[j].to_string());
res_line.push(code.to_string());
res.push(res_line);
}
}
res
}
/**
* 將結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)為最終文件內(nèi)容
*/
fn generate_file_content(source_arr: &Vec<Vec<String>>) -> String {
let mut dist_arr: Vec<String> = Vec::new();
// println!("res: {:?}", res);
for i in source_arr {
dist_arr.push(i.join(" ").to_string());
}
dist_arr.join("\n")
}
運(yùn)行程序
ζ cargo run --bin main
Compiling myrust v0.1.0 (/workspace/myrust)
Finished dev [unoptimized + debuginfo] target(s) in 0.70s
Running `target/debug/main`
轉(zhuǎn)換完成! 共處理89794條數(shù)據(jù)!
著不多9W條數(shù)據(jù)大概用了0.7秒巷波,還是很快的吧應(yīng)該萎津。
最終生成文件內(nèi)容類似:
工 a
恭恭敬敬 aaaa
工期 aaad
黃花菜 aaae
工巧 aaag
葡萄牙 aaah
花花世界 aaal
工藝 aaan
工匠 aaar
工區(qū) aaar
工薪 aaau
菚 aaau
斯蒂芬 aaaw
完結(jié)!!!