2011-12-21 8 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」と他を印刷するために管理することがわかりました私はそれが最高の解決策だったと思っています:)