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

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 就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值