QT連線Sqlite資料庫,中文路徑出錯

2021-06-29 02:12:42 字數 1776 閱讀 6508

qt對中文的支援是乙個很讓人頭疼的問題,前些天修改了乙個連線sqlite資料庫,資料庫中文路徑出錯,現在把怎麼解決的做一些記錄。

我用的是vs2010,首先確定自己用的是multi-byte還是unicode編碼,這兩種編碼直接決定呼叫windows的api的時候用的是a版還是mb版,這裡以下面這段**為例子。

#ifdef unicode

#define getmodulefilename getmodulefilenamew

#else

#define getmodulefilename getmodulefilenamea

#endif // !unicode

可以看到,我們用unicode編碼,呼叫getmodulefilename時,其實用的是getmodulefilenamea這個函式。那麼這兩個函式有什麼卻別呢,這就要說到寬位元組,跟單位元組的區別,unicode編碼格式的字串,都是寬位元組的,用wchar_t表示。我的理解,unicode一般指的是utf16或者utf32,而multi-byte一般指的是utf-8.

我用qt寫了乙個訪問sqlite的dll, 採用unicode編碼格式。 這個dll被另外乙個程式呼叫的時候,遇到中文路徑就會出錯。網上一堆解決辦法,什麼轉成utf-8就ok啊,但是我試了都沒效果。 研究了一上午,終於被我找到了解決辦法。

qt開啟資料庫的介面如下,引數是qstring.

bool open(const qstring& user, const qstring& password);
我的介面寫成下面這樣,為了通用性,我把資料庫的路徑引數寫成了const char *

bool open(const

char* cdbname,const

string &type/* = "qsqlite"*/)

然後內部,把這個cdbname的編碼格式轉成了轉成了gb18030格式

qstring tounicode(const

char* src)

所有呼叫這個dll的open函式的程式,都要保證傳遞進來的路徑名是單位元組編碼的,呼叫程式如果採用unicode編碼需要呼叫widechartomultibyte這個函式,保證傳遞進來的資料庫路徑是單位元組的。qsting有乙個utf16()的函式,這個函式返回const unsigned short*. 在保證下面配置為no的情況下,wchar_t是作為unsighed short處理的,這時utf16()返回的就是wchar_t *.

其實也可以把這個cdbname的編碼格式轉成了轉成了utf-8格式
qstring toutf8(const

char* src)

這種情況下,所有呼叫這個dll的open函式的程式,都要保證傳遞進來的路徑名是寬位元組編碼的,呼叫程式如果採用muti-byte編碼需要呼叫multibytetowidechar這個函式,保證傳遞進來的資料庫路徑是寬位元組的。

總結: 解決中文問題,單位元組要對應」gb18030」編碼格式, 寬位元組編碼要對應」utf-8」編碼格式。

qt連線sqlite資料庫(win下Qt5)

2.建立資料庫,此處我將資料庫名設為test,此處我通過控制台cmd建立資料庫和表,並插入資料,如果沒設定環境變數的話,需要到你解壓的目錄去執行,如下 生成的資料庫檔案 此檔案是在create table後生成的 如下 3.拷貝資料庫test到專案目錄下,注意是放到qtcreator生成的debug...

C 連線SQlite資料庫

這個位址有 追問 然後這裡呼叫,sqliteconnection conn new sqliteconnection configurationmanager.connectionstrings constr connectionstring 沒效果.回答 你是按照那裡面的寫的嗎?只要這個data ...

vc連線sqlite資料庫

下面是在mfc中連線sqlite資料庫,並向表中插入資料的部分 首先當然是配置sqlite3的執行環境了,tools options directories 裡分別設定所要包含的標頭檔案,lib的路徑,並 將sqlite3.dll拷貝到當前工程目錄下,在引用到的原始檔中包含sqlite3.h標頭檔案...