输入法词库解析(六)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拼音输入法,以前使用的是搜狗拼音输入法,后来发现可能由于我的系统重装过好几次,搜狗输入法也重装了好几次,而每次都删不干 ...
随机推荐
- Java 图片生成PDF
public static void main(String[] args) { String imageFolderPath = "E:\\Tencet\\图片\\test\\" ...
- 全面吃透JAVA Stream流操作,让代码更加的优雅
全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...
- Redis 内存优化神技,小内存保存大数据
大家好,我是「码哥」,大家可以叫我靓仔. 这次码哥跟大家分享一些优化神技,当你面试或者工作中你遇到如下问题,那就使出今天学到的绝招,一招定乾坤! 如何用更少的内存保存更多的数据? 我们应该从 Redi ...
- python requests 使用代理池访问https站点返回乱码
问题表现: 检查一下正常的请求头里面accept-encoding字段是否包含br,如果包含,果断pip install urllib3[brotli],详见ssl-warnings 记录另外一个问题 ...
- 【问题解决】Axios调用文件下载获取不到文件名
问题描述 自己开发了一个后端下载文件的接口,然后通过浏览器直接访问这个接口,浏览器能正确得到文件名并下载: 而使用Axios时发现获取不到,经过打印响应体发现响应头里没有文件名 而Java后端代码里是 ...
- 关于API:好的设计和坏的设计【eolink翻译】
以前开发或更新 API 时,我们经常需要深入讨论对 API 的结构.命名和功能等,这个花费了大量的时间. 随着 API 行业的蓬勃发展,API 设计也越来越重要.这么多年发展下来,一些如REST AP ...
- NOI / 2.1基本算法之枚举-8760:Cantor表
总时间限制: 1000ms 内存限制: 65536kB 描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 我们以Z字形给上表的每一项编 ...
- WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...
- 举重若轻流水行云,前端纯CSS3实现质感非凡的图片Logo鼠标悬停(hover)光泽一闪而过的光影特效
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_197 喜欢看电影的朋友肯定会注意到一个有趣的细节,就是电影出品方一定会在片头的Logo环节做一个小特效:暗影流动之间光泽一闪而过, ...
- 利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_165 上一篇文章:Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像,是在 ...