加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Sqlite及其.net provider简介和中文编码问题

发布时间:2020-12-12 23:38:43 所属栏目:百科 来源:网络整理
导读:sqlite的数据文件本身是使用utf-8或utf-16进行存储的,因此在中文支持上本来是没有问题的。 但在对于sql语句中的字符串,sqlite本身并不对它的编码进行变换,而是原封不动的拷贝。 因此如果用c/c++调用Sqlite的API进行读写,如果不特殊处理,在windows中文版

sqlite的数据文件本身是使用utf-8或utf-16进行存储的,因此在中文支持上本来是没有问题的。

但在对于sql语句中的字符串,sqlite本身并不对它的编码进行变换,而是原封不动的拷贝。

因此如果用c/c++调用Sqlite的API进行读写,如果不特殊处理,在windows中文版本上读写的中文字符串实际是gb2312编码的。这样存储的sqlite文件中的中文实际上就是gb编码。如果只是以这种方法进行读写并不存在乱码问题,因为被错写的中文也恰巧被错误的读了出来。但一旦与Sqlite.Net混合使用就会出现乱码了。

因为.Net是平台无关的,它的string类中,字符是统一编码的,因此在Sqlite.net与sqlite的接口处需要把.net string的编码转换成sqlite的默认编码,也就是utf编码。这就和前面c/c++的读写方法存在编码上的差异,如果用c/c++写.net读,或者.net写c/c++读都会出现乱码问题。

解决方法很简单,sqlite.net中的编码转换发生在sqlite3.cs文件中。它使用MarshalStr类来管理字符串,而它是可编码的,它的编码由sqlite3._enconding管理,因此只要把源码中

_encoding = Encoding.UTF8 替换成 _encoding = Encoding.Default 就可以了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读