作者:朱金燦
來源:http://blog.csdn.net/clever101
打開sqlite數據庫需要用到sqlite3_open函數,但是sqlite3_open函數的第一個參數是數據庫文件的絕對路徑。它是有講究的,必須是utf8字符串。也就是說假如文件路徑是非utf8字符,就得轉為utf字符。於是參考網上的資料,寫了一個最常用的從多字節轉utf8的函數,代碼如下:
// 編譯環境:VS 2008+sp1,Win7, 工程設置為多字節字符集 std::string MbcsToUtf8( const char* pszMbcs ) { std::string str; WCHAR *pwchar=0; CHAR *pchar=0; int len=0; int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; len=MultiByteToWideChar(codepage, 0, pszMbcs, -1, NULL,0); pwchar=new WCHAR[len]; if(pwchar!=0) { len = MultiByteToWideChar(codepage, 0, pszMbcs, -1, pwchar, len); if( len!=0 ) { len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, 0, 0, 0, 0); pchar=new CHAR[len]; if(pchar!=0) { len = WideCharToMultiByte(CP_UTF8, 0, pwchar, -1, pchar, len,0, 0); if(len!=0) { str = pchar; } delete pchar; } delete pwchar; } } return str; }
測試代碼如下:
// 編譯環境:VS 2008+sp1,Win7, 工程設置為多字節字符集 #include <sqlite3.h> #include <string> int main(void) { sqlite3* db = 0; char* pszErrMsg = NULL; // 連接數據庫 std::string strImgIndexFileName = “C:\\test.db” std::string strUtf8File = MbcsToUtf8(strImgIndexFileName.c_str()); int ret = sqlite3_open(strUtf8File.c_str(),&db); if ( ret != SQLITE_OK ) { fprintf(stderr, "無法打開數據庫: %s", sqlite3_errmsg(db)); return 1; } return 0; }
參考文獻: