输入法词库解析(六)QQ 拼音分类词库.qpyd
前言
.qpyd
是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn/v1/ 下载。
该格式解析的主要难点是其使用了 zlib 压缩,解压后的数据很好解析。
解析
原始文件
0x38 后跟的 4 字节表示压缩数据开始的字节。
0x44 后跟的 4 字节表示词条数。
0x60 - 0x16F 是词库的一些描述信息。
其余未知。
解压数据
使用了 zlib
格式。
我们看看解压后的数据是什么形式。
可以发现它分为两部分,前部分每 10 个一组,总长 10*词条数。
放到文本编辑器里分析一下,这里取了前后两部分前三条。
可以看到前部分是编码长和词长信息,后半部分 ascii 的编码 + utf-16le 的词条。
前半部分保存了所有词条的编码长,词长,索引位置。
占用字节数 | 描述 |
---|---|
1 | 拼音的长度 |
1 | 词字节长 |
4 | 未知,全是00 00 80 3F |
4 | 词条的索引位置 |
后半部分就是词条本身了,拼音和词,词条之间都是紧挨着的。
前面是编码,框里的是词。
代码实现:
func (QqQpyd) Parse(filename string) Dict {
data, _ := os.ReadFile(filename)
r := bytes.NewReader(data)
ret := make(Dict, 0, r.Len()>>8)
var tmp []byte
// 0x38 后跟的是压缩数据开始的偏移量
r.Seek(0x38, 0)
startZip := ReadUint32(r)
// 0x44 后4字节是词条数
r.Seek(0x44, 0)
dictLen := ReadUint32(r)
// 0x60 到zip数据前的一段是一些描述信息
r.Seek(0x60, 0)
head := make([]byte, startZip-0x60)
r.Read(head)
// headStr, _ := Decode(head, "UTF-16LE")
// fmt.Println(headStr) // 打印描述信息
// 解压数据
zrd, err := zlib.NewReader(r)
if err != nil {
log.Panic(err)
}
defer zrd.Close()
buf := new(bytes.Buffer)
buf.Grow(r.Len())
_, err = io.Copy(buf, zrd)
if err != nil {
log.Panic(err)
}
// 解压完了
r.Reset(buf.Bytes())
for i := 0; i < dictLen; i++ {
// 指向当前
r.Seek(int64(10*i), 0)
// 读码长、词长、索引
addr := make([]byte, 10)
r.Read(addr)
idx := BytesToInt(addr[6:]) // 后4字节是索引
r.Seek(int64(idx), 0) // 指向索引
// 读编码,自带 ' 分隔符
tmp = make([]byte, addr[0])
r.Read(tmp)
code := string(tmp)
// 读词
tmp = make([]byte, addr[1])
r.Read(tmp)
word, _ := util.Decode(tmp, "UTF-16LE")
ret = append(ret, Entry{word, strings.Split(code, "'"), 1})
}
return ret
}
输入法词库解析(六)QQ 拼音分类词库.qpyd的更多相关文章
- 用C语言将搜狗输入法词库转换成QQ拼音输入法词库
搜狗输入法词库格式: 'ni'kan'xia 你看下 'ni'kan'xia'gai'hou 你看下改后 'ni'kan'xing'ma 你看行吗 'ni'kan'zen'me'yang 你看怎么样 ...
- JavaScript Emoji 表情库_js 类似于qq微信的表情库
摘要: emoji就是表情符号,来自日语词汇“絵文字”(假名为“えもじ”,读音即emoji).emoji的创造者是日本人栗田穰崇(Shigetaka Kurita),他将目光投向儿时的各种元素以获取灵 ...
- QQ五笔词库转拼音词库小工具
参考文章<用QQ拼音打五笔>中提供的信息而制作的小工具,功能是将QQ五笔导出词库文件转换为QQ拼音自定义短语使用的.ini格式文件,这样就可以使用QQ拼音进行五笔拼音混输了. 混输效果不错 ...
- 输入法词库解析(四)百度分类词库.bdict(.bcd)
前言 .bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载. 手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.b ...
- 输入法词库解析(三)紫光拼音词库.uwl
详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...
- 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)
详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...
- 输入法词库解析(五)极点码表.mb
详细代码:https://github.com/cxcn/dtool 前言 mb 是极点五笔的码表格式. 解析 偏移量 描述 0x00 版本信息 0x1B 码表介绍 0x11F 所用到的按键数 0x1 ...
- 评价qq拼音输入法
我目前正在使用qq拼音输入法,从人机交互设计方面,我对qq输入法从用户界面.记住用户选择.短期刺激和长期使用的好处坏处.不让用户犯简单错误这四个方面进行了评价. 1.从用户界面方面: qq输入法用户界 ...
- 评价正在使用输入法软件产品----QQ拼音输入法
评价一下大家手头正在使用输入法或者搜索类的软件产品. 我现在使用的是系统自带的QQ拼音输入法,以前使用的是搜狗拼音输入法,后来发现可能由于我的系统重装过好几次,搜狗输入法也重装了好几次,而每次都删不干 ...
随机推荐
- Linux下修改RabbitMQ密码
1,首先查看用户列表 rabbitmqctl list_users 2,修改对应用户密码 其中username 为用户名, newpasswd为新密码 rabbitmqctl change_passw ...
- Lydon 分解与最小表示法
我们定义一个串是 \(\text{Lyndon}\) 串,当且仅当这个串的最小后缀就是这个串本身. 该命题等价于这个串是它的所有循环表示中字典序最小的. 引理 1:如果 \(u\) 和 \(v\) 都 ...
- 史上最全学习率调整策略lr_scheduler
学习率是深度学习训练中至关重要的参数,很多时候一个合适的学习率才能发挥出模型的较大潜力.所以学习率调整策略同样至关重要,这篇博客介绍一下Pytorch中常见的学习率调整方法. import torch ...
- day01--MarkDown语法格式
MarkDown语法格式 标题 一级标题 一级标题: 井号+空格+标题名字 二级标题 二级标题: 双井号+空格+标题名字 三级标题 三级标题: 三井号+空格+标题名字 ......... 字体 斜体( ...
- kube-scheduler的调度上下文
前一章节了解到了kube-scheduler中的概念,该章节则对调度上下文的源码进行分析 Scheduler Scheduler 是整个 kube-scheduler 的一个 structure,提供 ...
- 基于CentOS的IB网卡驱动安装
一.准备步骤 1.查看centos版本 cat /etc/issue或者cat /etc/redhat-release 2.查看linux版本 cat /proc/version或uname -a或 ...
- 1000-ms-maven相关问题
一.Maven有哪些优点和缺点 优点如下: 简化了项目依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具(jen ...
- 从零开始Blazor Server(4)--登录系统
说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...
- 使用rust调用c++静态库并编译nodejs包
在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...
- 【web自动化测试】playwright安装失败怎么办
在安装中,如果没有输入 playwright install, 则不会安装浏览器,运行 playwright codegen 时会报浏览器找不到的错误: "chromium" br ...