输入法词库解析(六)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拼音输入法,以前使用的是搜狗拼音输入法,后来发现可能由于我的系统重装过好几次,搜狗输入法也重装了好几次,而每次都删不干 ...
随机推荐
- adb工具
ADB:全称为Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具. 首先,下载ADB工具并安装: 下载:百度就有.下载后是个压缩包,将其拷贝到cm ...
- 分布式事务(Seata) 四大模式详解
前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...
- 2022省选前联考 AVL树/平衡树
题目描述 pks 得到了一棵 \(N\) 个节点,权值为 \(1\sim N\) 的 \(AVL\) 树,他觉得这棵树太大了,于是他想要删掉一些节点使得最后剩下的树恰好有 \(K\) 个节点.如果 p ...
- 感知器网络(MP模型)和自适应线性元件
- 最强人工智能 OpenAI 极简教程
大家好哇,新同学都叫我张北海,老同学都叫我老胡,其实是一个人,只是我特别喜欢章北海这个<三体>中的人物,张是错别字. 上个月安利了一波:机器学习自动补全代(hán)码(shù)神器,然后就 ...
- World Tour Finals 2019 D - Distinct Boxes 题解
太神了,专门写一篇题解 qwq 简要题意:给你 \(R\) 个红球和 \(B\) 个蓝球,你要把它们放到 \(K\) 个箱子里,要求没有两个箱子完全相同(即两种球个数就相同),求 \(K\) 的最大值 ...
- 4-9 基于Spring JDBC的事务管理(续)
10. 基于Spring JDBC的事务管理(续) 当需要方法是事务性的,可以使用@Transactional注解,此注解可以添加在: 接口 会使得此接口的实现类的所有实现方法都是事务性的 接口中的抽 ...
- ooday08 Java_多态_向下强制转型
笔记: 多态: 表现: 同一个对象被造型为不同的类型时,有不同的功能 --对象的多态:我.你.水......------所有对象都是多态的(明天体会) 同一类型的引用指向不同的对象时,有不同的实现 - ...
- 操作表查询&操作表创建&操作表删除&操作表修改
2.操作表 C(create):创建 语法: create table 表明( 列名1 数据类型1, 列名2 数据烈性2, .... 列名n 数据类型n ); create table Student ...
- DZY Loves Math II
简要题面 对于正整数 \(S, n\),求满足如下条件的素数数列 \((p_1,p_2,\cdots,p_k)\)(\(k\) 为任意正整数) 的个数: \(p_1\le p_2\le\cdots\l ...