Специальные символы не возвращаются SQLite3 - PullRequest
1 голос
/ 21 декабря 2011

У меня проблема с SQLite3 C API. Я пытаюсь прочитать некоторую информацию из базы данных place.sqlite, которую Firefox использует для хранения многих вещей. Что меня интересует, так это получить последний посещенный веб-сайт и связанный заголовок окна.

Я написал этот кусок кода:

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;
}

Когда нет специальных символов, все работает нормально, но если заголовок окна содержит, например, «é», «è» или «•», я получаю эти замечательные символы «Ã ©», «Ã¨» или «â € ¢». Я провел некоторое исследование и обнаружил, что некоторые люди на самом деле получают базы данных не в кодировке UTF8. Поэтому я проверил кодировку базы данных place.sqlite и с помощью SQLite Manager, и с запросом «PRAGMA encoding», и оба говорят, что это кодировка UTF-8. Затем я создал свою собственную базу данных, закодированную в UTF-8, ввел несколько специальных символов в таблицу, и это тоже не сработало. Поэтому я подумал, что, возможно, QtCreator (который я использую) не может отображать специальные символы, я попытался получить заголовок окна переднего плана с GetForegroundWindow() и распечатать его в выходных данных приложения QtCreator. Он успешно показал специальные символы некоторых заголовков окна.

Что мне здесь не хватает?

Спасибо.

1 Ответ

0 голосов
/ 23 декабря 2011

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(), мне удается правильно печатать "é" и другие символы из простого char *, но здесь я должен использовать wchar_t * ... Ну, это работает по крайней мере, будем надеяться, что это было лучшее решение:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...