输入法词库解析(一)百度自定义方案.def
前言
.def 是百度手机输入法-更多设置-自定义输入方案所使用的格式。
解析
码表偏移量 0x6D
| # | 占用字节数 | 描述 |
|---|---|---|
| a | 1 | 编码长度(红色框) |
| b | 1 | 词长 * 2 + 2 |
| a | 编码(黄色框),可以是纯编码,也可以是 编码=位置 |
|
| b-2 | 词(绿色框),utf16-le 编码 | |
| 6 | 6 个空字节代表词条结束 |
代码实现:
r.Seek(0x6D, 0) // 从 0x6D 开始读
for r.Len() > 4 {
codeLen, _ := r.ReadByte() // 编码长度
wordSize, _ := r.ReadByte() // 词长*2 + 2
// 读编码
tmp = make([]byte, int(codeLen))
r.Read(tmp) // 编码切片
code := string(tmp)
spl := strings.Split(code, "=") // 直接删掉 = 号后的
code = spl[0]
// 读词
tmp = make([]byte, int(wordSize)-2) // -2 后就是字节长度,没有考虑4字节的情况
r.Read(tmp)
word, _ := util.Decode(tmp, "UTF-16LE")
// def = append(def, defEntry{word, code, order})
ret = append(ret, Entry{word, code, 1})
r.Seek(6, 1) // 6个00,1是相对当前位置
}
生成
码表部分和解析一样的,没什么好说的。
主要考虑前 0x6C(109) 个字节。
第一个字节意义不明,可能是最大码长(一般是 0,有的码表里是 4)
后面每 4 字节一组,共 27 组。
表示以 26 个首字母开头词条的字节长度累加(不包括前 2 个表示长度的字节,包括后 6 个 0)
计算时,统计每个首字母的长度累计,写入时再次累加。
代码实现:
func (BaiduDef) Gen(table Table) []byte {
jdt := ToJdTable(table)
var buf bytes.Buffer
// 首字母词条字节数统计
lengthMap := make(map[byte]int)
buf.Write(make([]byte, 0x6D))
for _, v := range jdt {
code := v.Code
for i, word := range v.Words {
if i != 0 { // 不在首选的写入位置信息,好像没什么用?
code = v.Code + "=" + strconv.Itoa(i+1)
}
sliWord, _ := util.Encode([]byte(word), "UTF-16LE") // 转为utf-16le
buf.WriteByte(byte(len(code))) // 写编码长度
buf.WriteByte(byte(len(sliWord) + 2)) // 写词字节长+2
buf.WriteString(code) // 写编码
buf.Write(sliWord) // 写词
buf.Write([]byte{0, 0, 0, 0, 0, 0}) // 写6个0
// 编码长度 + 词字节长 + 6,不包括长度本身占的2个字节
lengthMap[code[0]] += len(code) + len(sliWord) + 2 + 6
}
}
// 文件头
byteList := make([]byte, 0, 0x6D)
byteList = append(byteList, 0) // 第一个字节可能是最大码长?
// 长度累加
var currNum int
for i := 0; i <= 26; i++ {
currNum += lengthMap[byte(i+0x60)]
currBytes := make([]byte, 4)
binary.LittleEndian.PutUint32(currBytes, uint32(currNum))
byteList = append(byteList, currBytes...)
}
// 替换文件头
ret := buf.Bytes()
copy(ret, byteList)
return ret
}
参考资料:
输入法词库解析(一)百度自定义方案.def的更多相关文章
- 输入法词库解析(四)百度分类词库.bdict(.bcd)
前言 .bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载. 手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.b ...
- 输入法词库解析(六)QQ 拼音分类词库.qpyd
详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...
- 输入法词库解析(三)紫光拼音词库.uwl
详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...
- 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)
详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...
- 输入法词库解析(七)微软用户自定义短语.dat
详细代码:https://github.com/cxcn/dtool 前言 微软拼音和微软五笔通用的用户自定义短语 dat 格式. 解析 前 8 个字节标识文件格式 machxudp,微软五笔的 le ...
- 输入法词库解析(五)极点码表.mb
详细代码:https://github.com/cxcn/dtool 前言 mb 是极点五笔的码表格式. 解析 偏移量 描述 0x00 版本信息 0x1B 码表介绍 0x11F 所用到的按键数 0x1 ...
- paip 自定义输入法多多输入法词库的备份导出以及导入
paip 自定义输入法词库的备份导出以及导入 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/ ...
- 用C语言将搜狗输入法词库转换成QQ拼音输入法词库
搜狗输入法词库格式: 'ni'kan'xia 你看下 'ni'kan'xia'gai'hou 你看下改后 'ni'kan'xing'ma 你看行吗 'ni'kan'zen'me'yang 你看怎么样 ...
- 把搜狗输入法词库导入Google拼音输入法
为PC端Google拼音输入法增加词库 为什么折腾词库 都在说百度.讯飞等输入法上传用户词库,为了安全建议大家使用google输入法之类,话说回来,要想使用智能联想功能是不是就得把你输入习惯放在他的里 ...
随机推荐
- Codeforces Round #791 (Div. 2) A-C
Codeforces Round #791 (Div. 2) A-C A 题目 https://codeforces.com/contest/1679/problem/A 题解 思路 知识点:数学,暴 ...
- 全国土壤阳离子交换量CEC空间分布数据
数据下载链接:百度云下载链接 土壤阳离子交换量,简称CEC,是指土壤胶体所能吸附各种阳离子的总量.土壤阳离子交换量 cation exchange capacity 即CEC 是指土壤胶体所能吸附各 ...
- Mac Sierra开启读写NTFS
查看卷标diskutil list sudo vim /etc/fstab,开启WinD盘符读写,添加如下: LABEL=WinD none ntfs rw,auto,nobrowse 磁盘工具重新挂 ...
- P4289 【一本通提高篇广搜的优化技巧】[HAOI2008]移动玩具
[HAOI2008]移动玩具 题目描述 在一个 4 × 4 4\times4 4×4 的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方 ...
- SQL语言的总结
SQL语言分类:1.数据查询语言(DQL:Data Query Language),也称为"数据检索语句",用以从表中查询获得数据,常用关键字SELECT (一般常用的语句是:SE ...
- C#爬虫之通过Selenium获取浏览器请求响应结果
前言 在进行某些爬虫任务的时候,我们经常会遇到仅用Http协议难以攻破的情况,比如协议中带有加密参数,破解需要花费大量时间,那这时候就会用Selenium去模拟浏览器进行页面上的元素抓取 大多数情况下 ...
- Sphere类定义
这个类是球体,也就是一会要显示的球体了.这个类继承于Geometrics类,并实现了自己的碰撞检测,碰撞原理,书上也说的很清楚了啊,大家多看.然后对照代码就明白了. 类定义: #pragma once ...
- Floyd算法详解
Floyd本质上使用了DP思想,我们定义\(d[k][x][y]\)为允许经过前k个节点时,节点x与节点y之间的最短路径长度,显然初始值应该为\(d[k][x][y] = +\infin (k, x, ...
- 手把手教你定位线上MySQL锁超时问题,包教包会
昨晚我正在床上睡得着着的,突然来了一条短信. 什么?线上的订单无法取消! 我赶紧登录线上系统,查看业务日志. 发现有MySQL锁超时的错误日志. 不用想,肯定有另一个事务正在修改这条订单,持有这条订单 ...
- 开源图编辑库 NebulaGraph VEditor 的设计思路分享
本文首发于 NebulaGraph 公众号 NebulaGraph VEditor 是一个拥有高性能.高可定制的所见即所得图可视化编辑器前端库. NebulaGraph VEditor 底层基于 SV ...