详细代码:https://github.com/cxcn/dtool

前言

.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的更多相关文章

  1. 用C语言将搜狗输入法词库转换成QQ拼音输入法词库

    搜狗输入法词库格式: 'ni'kan'xia 你看下 'ni'kan'xia'gai'hou 你看下改后 'ni'kan'xing'ma 你看行吗 'ni'kan'zen'me'yang 你看怎么样 ...

  2. JavaScript Emoji 表情库_js 类似于qq微信的表情库

    摘要: emoji就是表情符号,来自日语词汇“絵文字”(假名为“えもじ”,读音即emoji).emoji的创造者是日本人栗田穰崇(Shigetaka Kurita),他将目光投向儿时的各种元素以获取灵 ...

  3. QQ五笔词库转拼音词库小工具

    参考文章<用QQ拼音打五笔>中提供的信息而制作的小工具,功能是将QQ五笔导出词库文件转换为QQ拼音自定义短语使用的.ini格式文件,这样就可以使用QQ拼音进行五笔拼音混输了. 混输效果不错 ...

  4. 输入法词库解析(四)百度分类词库.bdict(.bcd)

    前言 .bdict 是百度的分类词库格式,可以在 https://shurufa.baidu.com/dict 下载. 手机百度的分类词库格式 .bcd 是一样的,可以在 https://mime.b ...

  5. 输入法词库解析(三)紫光拼音词库.uwl

    详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...

  6. 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)

    详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...

  7. 输入法词库解析(五)极点码表.mb

    详细代码:https://github.com/cxcn/dtool 前言 mb 是极点五笔的码表格式. 解析 偏移量 描述 0x00 版本信息 0x1B 码表介绍 0x11F 所用到的按键数 0x1 ...

  8. 评价qq拼音输入法

    我目前正在使用qq拼音输入法,从人机交互设计方面,我对qq输入法从用户界面.记住用户选择.短期刺激和长期使用的好处坏处.不让用户犯简单错误这四个方面进行了评价. 1.从用户界面方面: qq输入法用户界 ...

  9. 评价正在使用输入法软件产品----QQ拼音输入法

    评价一下大家手头正在使用输入法或者搜索类的软件产品. 我现在使用的是系统自带的QQ拼音输入法,以前使用的是搜狗拼音输入法,后来发现可能由于我的系统重装过好几次,搜狗输入法也重装了好几次,而每次都删不干 ...

随机推荐

  1. Android Studio的初次认识

    Android的初试 一.认识Android Studio 在我们新建项目的时候,会遇到这样的一个窗口,首先我们认识一下这些都是什么,这样我们才能够更好的进行下一步的学习! 这里的 Phone and ...

  2. vue3代码编写

    vue3代码编写 团队内的vue3已经升级一年,在这一年中vue也在不停的更新,为了最大化组合式api带来的优势,便需要合理规范代码的编写方式- 1.从vue2到vue3 vue2组件采用配置式API ...

  3. Centos7安装最新docker

    Centos7安装最新docker(root身份运行) 环境查看 CentOS 需要7版本以上,内核最好3.10以上 1.查看Linux版本:rpm -q centos-release 2.查看内核版 ...

  4. 5.1 从C到C++

    在前4章中介绍了C语言的主要内容,已经足以应付许多算法竞赛的题目了,然而能写不代表好写,有些虽然能够用C语言实现,但是使用C++写起来往往会更快,并且不容易出错 从c到c++ C语言是一门很有用的语言 ...

  5. C# 给Word每一页设置不同文字水印

    Word中设置水印时,可预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水印效果,则可以参考本文中的方法.下面,将以C# ...

  6. linux rz上传失败

    最近rz上传文件时出现了一次文件上传失败的情况,故搜集了以下资料加强学习 rz -ary --o-sync -a 表示使用ascii码格式传输文件,如果是Dos格式的文件,会转换为unix格式 -r ...

  7. 虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_183 2021年,对于正在找工作的朋友来说,笼罩在新冠肺炎疫情之下,今年的就业季显得更加具有挑战性,更有意思的是,每当这个时候,各 ...

  8. 最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解

    研究了LCA,写篇笔记记录一下. 讲解使用例题 P3379 [模板]最近公共祖先(LCA). 什么是LCA 最近公共祖先简称 LCA(Lowest Common Ancestor).两个节点的最近公共 ...

  9. 安装 NetworkManager(Debian最小化安装)

    Debian最小化安装是没有NetworkManager 1 安装: 2 [root@debian]apt install -y netwok-manager 1 启动(查看网卡): 2 [root@ ...

  10. Web 前端模块出现的原因,以及 Node.js 中的模块

    模块出现原因 简单概述 随着 Web 2.0 时代的到来,JavaScript 不再是以前的小脚本程序了,它在前端担任了更多的职责,也逐渐地被广泛运用在了更加复杂的应用开发的级别上. 但是 JavaS ...