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 就可以了。
总结以上是内存溢出为你收集整理的Sqlite及其.net provider简介和中文编码问题全部内容,希望文章能够帮你解决Sqlite及其.net provider简介和中文编码问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)