我們知道使用sqlite庫,使用sqlite3_open開啟或建立資料庫檔案的時,有的時候會失敗或者資料庫名稱就是亂碼,這是為什麼呢?
(1)在linux平台下,系統編碼是utf8,很少出現問題。
(2)問題主要是windows平台下,如果資料庫檔名稱或路徑有中文,通常會出現錯誤。其實這是sqlite3_open函式的問題,該函式要求檔名稱的引數必須是utf8.
sqlite_api int
sqlite3_open
(const
char
*filename,
/* database filename (utf-8) */
sqlite3 *
*ppdb /* out: sqlite db handle */
);
(1)方法一
sqlite除了使用sqlite3_open開啟資料庫之外,還提供了sqlite3_open16以及sqlite3_open_v2,他們函式原型是
sqlite_api int
sqlite3_open16
(const
void
*filename,
/* database filename (utf-16) */
sqlite3 *
*ppdb /* out: sqlite db handle */);
sqlite_api int
sqlite3_open_v2
(const
char
*filename,
/* database filename (utf-8) */
sqlite3 *
*ppdb,
/* out: sqlite db handle */
int flags,
/* flags */
const
char
*zvfs /* name of vfs module to use */
);
中文windows平台預設字元編碼是gbk,可以使用sqlite3_open16代替sqlite3_open,需要配置vs為字符集:使用 unicode 字符集,包含標頭檔案#include 或者,開啟資料庫如下:
sqlite3_open16
(text
("d:/新建資料夾/測試test.db"
), db)
;
(2)方法二
gbk轉成utf8,**如下
//gbk轉utf8
char
*gbktoutf8_c
(const
char
* chgbk)
//utf8轉gbk
char
*utf8togbk_c
(char
* chutf8)
一定要記得free。
(3)方法三
sqlite封裝了mbcs和utf8之間轉換的函式。可以參考為的
sqlite_api char
*sqlite_stdcall sqlite3_win32_mbcs_to_utf8
(const
char
*ztext)
;sqlite_api char
*sqlite_stdcall sqlite3_win32_utf8_to_mbcs
(const
char
*ztext)
;sqlite_api char
*sqlite_stdcall sqlite3_win32_mbcs_to_utf8_v2
(const
char
*ztext,
int useansi)
;sqlite_api char
*sqlite_stdcall sqlite3_win32_utf8_to_mbcs_v2
(const
char
*ztext,
int useansi)
;
(4)方法四
使用qt的sqlite。
激勵為什麼會失效
摘要 不是注重用外部的力量來激勵員工,而是要用認可和獎勵點燃員工的心中之火。點評 著名的調查公司sirota survey intelligence的一項大型調查表明,大約85 的公司的員工,在入職的時候都是情緒高漲,但是在工作6個月之後,熱情會急劇下降,並在以後的工作中會持續下降。也許正因為這個現...
員工為什麼會離職
網上摘抄的,說得很確切,有參考學習價值,馬雲說 員工的離職原因,只有兩點最真實 1 錢,沒給到位。2 心,委屈了。這些歸根到底就一條 幹得不爽。員工臨走還費盡心思找靠譜的理由,就是為給你留面子,不想說穿你的管理有多爛 他對你已失望透頂。仔細想想,真是人性本善。作為管理者,定要樂於反省。帶團隊,你得問...
員工為什麼會離職?
網上摘抄的,說得很確切,有參考學習價值,馬雲說 員工的離職原因,只有兩點最真實 1 錢,沒給到位。2 心,委屈了。這些歸根到底就一條 幹得不爽。員工臨走還費盡心思找靠譜的理由,就是為給你留面子,不想說穿你的管理有多爛 他對你已失望透頂。仔細想想,真是人性本善。作為管理者,定要樂於反省。帶團隊,你得問...