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標頭檔案...