C#通过SQLiteDataReader读取GBK(gb2312)格式的SqLite数据库
正常情况下,C#通过SQLiteDataReader读SqLite数据库,不论读写都是采用的uft-8格式编码。
但是我在搞QQ群机器人(Mirai)的时候,遇到了读取以前旧版本机器人数据库的情况。旧片机器人是采用java或者C++程序写的,存取时的编码是GBK(gb2312),然后在原来的程序里面打开和编辑的时候都是正常的。
但是我用SQLiteStudio读取出来的就是乱码,一度我以为是原来的程序在存取的时候做了加密或者转码,直到前几天遇到另一个SqLite工具:sqlite admin,在这个工具里面打开数据库,就是正常显示的内容。所以,是我把问题想复杂了。
然后我就断断续续尝试了好几天,想要通过一定的试,让【System.Data.SQLite】能够以“GBK”方式读取数据库,但是都失败了。
我看到有的资料说,System.Data.SQLite在 SQLiteDataReader的 GetString(i)方法当中,做了一次转utf-8的操作。
所以,我就想尝试跳过这一步,直接读取原来的字节流。
但是这个方法是不行的。这种读取字节的方式,只允许针对 Blog类型的字段(上传的音频、图片、视频、PDF等等)。
到这里,我都已经放弃了。换成python的话,其实很简单。
但是我又不死心,换回来用C#继续搞。
其中遇到这个教程,我都以为终于解决了。
http://www.aiyiweb.com/csharp/55605
然而实际上还是不行。
只能继续找啊找,直到发现了这一篇:
https://www.php1.cn/detail/-CSharpTips-C-_D_cd072edb.html
它的核心原理是,SQLiteDataReader将字符转成utf-8之前,在执行sql的时候,抢先一步将数据库里面的内容(byte)转换为16进制格式的字符串。
读取出来之后再经过两步还原,就得到了原来的字符内容了。
因为原贴的是别的地方从园子里盗贴的,所以,它有一段代码显示不全,我就用另一个方法一还原的。
我在周五的晚上搞出来以后,电脑开着很多的程序,玩了一会LOL,没想到电脑突然重启了,程序虽然没有影响,但是中间找过的各种资料都不见了。
今天又重新找了一下,这里发现,原来这个方案是园子里面的:
https://www.cnblogs.com/axiaoshuye/p/15895229.html
漂泊是无尽的轮回。