2011-12-21 45 views
1

我遇到SQLite3 C API的問題。我試圖從Firefox用來存儲很多東西的places.sqlite數據庫中讀取一些信息。我感興趣的是檢索上次訪問的網站和相關的窗口標題。SQLite3不返回的特殊字符

我寫這段代碼:

query = "SELECT `url`, `title` FROM `moz_places` WHERE `id`=(SELECT `place_id` FROM `moz_historyvisits` ORDER BY `id` DESC LIMIT 1)"; 
stmt = NULL; 
if (sqlite3_prepare_v2(db, query.c_str(), strlen(query.c_str()) + 1, &stmt, NULL) != SQLITE_OK) 
    cerr << sqlite3_errmsg(db) << endl; 
else 
{ 
    while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) 
     cout << sqlite3_column_text(stmt, 0) << endl << sqlite3_column_text(stmt, 1) << endl; 
    if (ret != SQLITE_DONE) 
     cerr << sqlite3_errmsg(db) << endl; 
} 

當有它工作正常,無特殊字符,但如果窗口標題包含例如「E」,「E」或「•」,我得到那些美妙的人物「Ã」,「è」或「•」。 我做了一些研究,發現有些人實際上得到了非UTF8編碼的數據庫。所以我用SQLite Manager和「PRAGMA編碼」請求檢查了places.sqlite數據庫編碼,都聲稱它是UTF-8編碼。 然後我創建了我自己的數據庫,用UTF-8編碼,在表格中輸入了一些特殊字符,但它也不起作用。所以我認爲也許QtCreator(我正在使用)不能顯示特殊字符,我試圖用GetForegroundWindow()獲得前景窗口標題並將其打印在QtCreator應用程序輸出中。它成功地展示了一些窗口標題的特殊字符。

我在這裏錯過了什麼?

謝謝。

回答

0

的Weel,好像我設法通過使用此功能,我寫來解決這個問題:

wchar_t    *char_to_wchar(const char *str) 
{ 
    wchar_t   *wbuf; 
    int    wsz; 

    if (!str) 
     return (NULL); 
    wbuf = NULL; 
    wsz = MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, 0); 
    if (wsz) 
     wbuf = (wchar_t*)malloc(wsz * sizeof(*wbuf)); 
    else 
     cerr << "MultiByteToWideChar fail getting required size: " << GetLastError() << endl; 
    if (wbuf) 
    { 
     if (!MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, wsz)) 
      cerr << "MultiByteToWideChar fail: " << GetLastError() << endl; 
    } 
    return (wbuf); 
} 

不過,我發現很奇怪,隨着像GetWindowText()功能我設法正確打印「E」和其他字符從一個簡單的char *,但在這裏,我必須使用wchar_t * ... 那麼,它的作品至少,讓我們希望這是最好的解決方案:)