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 就可以了。
原文链接:https://www.f2er.com/sqlite/203172.html