关于CppSqlite中数据库文件中文路径识别问题的解决方法
2010-11-17 15:39
766 查看
其实关于这个问题网上给出了很多解决方法,大致就是sqlite原生不支持中文路径,需要对中文进行utf-8编码后方可支持。但网上的方法都是针对sqlite的,对于CppSqlite却没有提及。
我曾试过在CppSqlite中,先对路径进行编码,再打开数据库,但依然无法识别。后来发现自己疏忽大意了,无论在CppSqlite中怎么编码,一旦把这个路径字符串传到sqlite中依然是没有编码的字符串,所以应该在底层的sqlite中编码而不是CppSqlite中。
具体方案如下:
1.打开CppSQLite3.h文件,找到class CppSQLite3DB,在public中声明两个编码函数
2.打开CppSQLite3.cpp,增加编码函数的实现。
3.修改void CppSQLite3DB::open(const char* szFile)函数
当然,如果你比较懒,不想自己动手改,也可以下载我已经修改好的版本:
http://download.csdn.net/source/2839202
我曾试过在CppSqlite中,先对路径进行编码,再打开数据库,但依然无法识别。后来发现自己疏忽大意了,无论在CppSqlite中怎么编码,一旦把这个路径字符串传到sqlite中依然是没有编码的字符串,所以应该在底层的sqlite中编码而不是CppSqlite中。
具体方案如下:
1.打开CppSQLite3.h文件,找到class CppSQLite3DB,在public中声明两个编码函数
char *unicodeToUtf8(const WCHAR *zWideFilename); WCHAR *mbcsToUnicode(const char *zFilename);
2.打开CppSQLite3.cpp,增加编码函数的实现。
char *CppSQLite3DB::unicodeToUtf8(const WCHAR *zWideFilename) { int nByte; char *zFilename; nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); zFilename = (char *)malloc(nByte); if(zFilename == 0) { return 0; } nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, 0, 0); if( nByte == 0 ) { free(zFilename); zFilename = 0; } return zFilename; } WCHAR *CppSQLite3DB::mbcsToUnicode(const char *zFilename) { int nByte; WCHAR *zMbcsFilename; int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR); zMbcsFilename = (WCHAR *)malloc(nByte*sizeof(zMbcsFilename[0])); if( zMbcsFilename==0 ) { return 0; } nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte); if(nByte == 0) { free(zMbcsFilename); zMbcsFilename = 0; } return zMbcsFilename; }
3.修改void CppSQLite3DB::open(const char* szFile)函数
void CppSQLite3DB::open(const char* szFile) { char *pPath; WCHAR *wcPath; wcPath = mbcsToUnicode(szFile); pPath = unicodeToUtf8(wcPath); int nRet = sqlite3_open(pPath, &mpDB); if (nRet != SQLITE_OK) { const char* szError = sqlite3_errmsg(mpDB); throw CppSQLite3Exception(nRet, (char*)szError, DONT_DELETE_MSG); } setBusyTimeout(mnBusyTimeoutMs); }
当然,如果你比较懒,不想自己动手改,也可以下载我已经修改好的版本:
http://download.csdn.net/source/2839202
相关文章推荐
- 关于CppSqlite中数据库文件中文路径识别问题的解决法
- 关于拖拽文件启动VBS文件会导致相对路径改变的问题以及解决方法
- iOS中关于读取已存在的数据库问题:路径为空的解决方法
- andorid 解压zip文件、android中文文件存放问题、asset里不能放中文名文件的解决方法、用File读asset的路径的问题、把asset的文件写入机器
- sqlite3实现中文路径sql文件导入另类解决方法
- sqlite打开路径含中文的数据库文件失败的问题
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- 关于Android编程文件路径中含有中文字符的问题解决办法
- Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题
- 关于各种文件用Editplus的方式打开出现“向程序发送命令时出现问题”的解决方法
- 关于QT5 SQLITE中QSqlQuery::exec: database not open的问题的解决方法
- (转)MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- Hadoop关于处理大量小文件的问题和解决方法
- Java乱码 数据库乱码 url乱码 url中文参数乱码 标签乱码问题解决方法
- 配置android时出现path问题,因为路径有中文,完美解决方法
- 关于提交文件和提交图片时可能引发的安全问题和解决方法
- MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- 关于GDAL180中文路径不能打开的问题分析与解决