powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqLite и winApi
14 сообщений из 14, страница 1 из 1
sqLite и winApi
    #36107434
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Хочу использовать в программе sqlite.
Программа юникодная.
пишу на C++ (minGW) + win32 api.

SqLite для меня ещё в новинку. И вот он брыкаеться. Надеюсь на вашу помощь, в укращении.


1. открываю
sqlite3_open("midata.db");
не вкурил, как указывать utf-16.


2. запрос делаю
rc = sqlite3_exec(db, "select * from authors", ReadRowsAuthors, hList, &errmsg );

вообщем как обычно.
Но функция должна быть объявлена
static int ReadRowsAuthors( void*, int, WCHAR**, WCHAR** );
Ведь мне нужен WCHAR, а не char. Но компилер ругаеться.

Когда меняю на char, выводиться хрень. Явно проблема в кодировке.

3. добавление записей.
Я временно, добавил тестовые записи с консоли, латинскими буквами.
Но мне нужно, чтобы программа сама добавляла записи. А тут ещё одна проблема. Они у меня опять WCHAR. А функция
sqlite3_exec() просит char.

Ясно, что я ещё не догуглился. А вот что именно искать, то и не пойму. Будте добреньки, расскажите!
...
Рейтинг: 0 / 0
sqLite и winApi
    #36107540
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо использовать функции, которые оканчиваются на 16.
...
Рейтинг: 0 / 0
sqLite и winApi
    #36107561
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Компилер ругаеться
src\modules/authors.cpp:21: error: `sqlite3_exec16' was not declared in this scope

Может ещё чего нужно?
...
Рейтинг: 0 / 0
sqLite и winApi
    #36107596
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlite3_exec и многие другие без текстовых аргументов существуют только в одном варианте.
Большинство функций с текстовыми аргументами, например sqlite3_prepare существуют в
двух вариантах - просто и с 16 на конце имени.

Точнее - RTFM.
...
Рейтинг: 0 / 0
sqLite и winApi
    #36107621
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мой английский плох. Но я всё же заглянул в официальную документацию.
sqlite3_exic действительно только одна.
http://sqlite.org/c3ref/exec.html

И вроде бы она возвращяет всё в utf-8.
А значит ещё нужно конвертить полученный результат.

Ну а как добавить новую запись?

Да и как из utf-8 лучше преобразовать? Вроде бы winApi multibiteToWideChar только с ansi работают?
...
Рейтинг: 0 / 0
sqLite и winApi
    #36107720
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок! Переписал функцию так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
static int ReadRowsAuthors(
void *hList, //  дополнительные данные
int coln, // число столбцов в запрашиваемой таблице 
char** rows, // массив значений записи
char** colnm // имена столбцов 
) {
WCHAR buf[ 128 ]; // буфер для строки
int l; // длина строки

// конвертируем из utf- 8  в wide char
l = MultiByteToWideChar( CP_UTF8, NULL, rows[ 4 ], - 1 , buf,  255  );

// ограничиваем двоичным нулём
buf[l] = L'\0';

// добавляем в список
LBADDS( (HWND)hList, buf );

return  0 ;
}

И всё равно хрень выводиться. А ведь я в базу скидывал пока только латинские буковки.
...
Рейтинг: 0 / 0
sqLite и winApi
    #36107743
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой, нет - вру. Выводиться.
Надо было поставить префикс, перед строкой
sqlite3_open16( L"midata.db", &db );
Радует. Надо теперь русские буковки попробовать.

А вставлять записи надо тоже в utf-8 кодировке?
...
Рейтинг: 0 / 0
sqLite и winApi
    #36108327
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Eric-SОй, нет - вру. Выводиться.
Надо было поставить префикс, перед строкой
sqlite3_open16( L"midata.db", &db );
Радует. Надо теперь русские буковки попробовать.

А вставлять записи надо тоже в utf-8 кодировке?

А почему вы не хотите хранить данные и работать с ними в единой кодировке? SQLite позволяет хранить как utf18, так и utf8.
...
Рейтинг: 0 / 0
sqLite и winApi
    #36108576
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А кто сказал, что я не хочу в единой кодировке?
Просто я читая мануал, догадался что мне выводиться в utf-8. Из чего я и решил, что мне нужно его как-то конвертировать.
Я только сегодня вообще взялся за этот sqLite.

Вопрос же в первом посте. Ещё раз переформулирую его.

Как мне читать и писать данные WCHAR, в sqLite?

Кстати, кирилица у меня не заработала.
Когда я в консоли добавляю и проверяю руские буковки, то всё ок.
Когда же читаю в программе, то одни вопросики.

Из чего я делаю вывод, что либо я конвертирую не правильно.
Либо в консоли не конвертируеться вообще.

Сейчас делаю функцию добавления записи в базу. Вот и узнаем, где глюк.

А если кто объяснит, где собаку закопать, то буду благодарен!
...
Рейтинг: 0 / 0
sqLite и winApi
    #36108587
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBGА почему вы не хотите хранить данные и работать с ними в единой кодировке? SQLite позволяет хранить как utf16, так и utf8.

Пожалуйста объясните, как выставлять кодировку хранения, как писать и как читать в utf-16.
Для меня это наиболее удобный вариант.
...
Рейтинг: 0 / 0
sqLite и winApi
    #36108640
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Eric-SMBGА почему вы не хотите хранить данные и работать с ними в единой кодировке? SQLite позволяет хранить как utf16, так и utf8.

Пожалуйста объясните, как выставлять кодировку хранения, как писать и как читать в utf-16.
Для меня это наиболее удобный вариант.

Формат хранения:
Код: plaintext
1.
2.
3.
4.
PRAGMA encoding; 
PRAGMA encoding = "UTF-8"; 
PRAGMA encoding = "UTF-16"; 
PRAGMA encoding = "UTF-16le"; 
PRAGMA encoding = "UTF-16be";

Возвращаемые значения:
Код: plaintext
1.
2.
3.
void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*));
void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*));
void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*));
void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*));

Как видите, эскулайт умеет сам все перекодировать, вам остается только выбрать нужное. Как пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
/*
Sybase current_user() function

select current_user();
veter
*/
static void current_userFunc(
        sqlite3_context *context,
        int argc,
        sqlite3_value **argv
) {
        struct passwd *who;
        if ((who = getpwuid(getuid ())) != NULL)
        {
                sqlite3_result_text( context, (char*)who->pw_name, - 1 , SQLITE_TRANSIENT);
                return;
        }
        sqlite3_result_null(context);
}

Здесь результат будет в UTF-8, а можно вернуть в UTF-16 с помощью void sqlite3_result_text16. См. также sqlite3_value_text16. Зачастую достаточно unsigned char - микрософтовские WCHAR совсем из другой оперы (см. тип wchar_t, если оно вам надо, хотя можно просто работать с двухбайтовыми символами UTF-16 - если ваше приложение не нуждается в сортировке символов и приведении регистра, то поддержка юникода собственно и не нужна). В рассылке sqlite-users все это сто раз обсуждалось, читайте архивы. Еще можете посмотреть исходный код модуля реализации поддержки юникода для эскулайт (в расширении используется внутреннее представление в виде UTF8, а сами данные могут быть как в UTF8, так и в UTF16):
http://mobigroup.ru/files/sqlite-ext/unicode/
...
Рейтинг: 0 / 0
sqLite и winApi
    #36109530
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понял! Это вообще куда подключать?

Я использую sqlite3_exec() и она вызывает calback функцию.
А других способов и не знаю.

И куда мне прикручивать всякие sqlite3_result_text16?

Ладно, с чтением я сяма всё раскодирую. Да и при вставке могу закодировать. Но это же изврат!
Вот в мускуле mysql_setcharset и зашибись.


В прочем, здесь же на форуме, ещё одна тема
http://www.sql.ru/forum/actualthread.aspx?tid=540148
Похожая проблема. И тоже без конкретики.

Ладно. Я ещё попробую сам поискать.
А рассылка - она же английская! Я в мануале-то путаюсь...
Или может есть рускоязычные ресурсы по sqlite?
...
Рейтинг: 0 / 0
sqLite и winApi
    #36109756
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Eric-SНе понял! Это вообще куда подключать?

Я использую sqlite3_exec() и она вызывает calback функцию.
А других способов и не знаю.

И куда мне прикручивать всякие sqlite3_result_text16?

Ладно, с чтением я сяма всё раскодирую. Да и при вставке могу закодировать. Но это же изврат!
Вот в мускуле mysql_setcharset и зашибись.


Ничего перекодировать не нужно, что непонятно-то? Работаете в utf8, к примеру, так и храните в этой же кодировке. Разберитесь сначала, что такое юникод и как он представляется в utf8 или utf16, тогда и вопросов не будет.

Eric-S
В прочем, здесь же на форуме, ещё одна тема
http://www.sql.ru/forum/actualthread.aspx?tid=540148
Похожая проблема. И тоже без конкретики.


Вам предложена ссылка с примером, какая еще вам конкретика нужна?

Eric-SА рассылка - она же английская! Я в мануале-то путаюсь...
Или может есть рускоязычные ресурсы по sqlite?

Хотите разобраться - читайте рассылку, не хотите - ищите сами как-нибудь иначе. На русском языке есть более или менее кривые переводы манов, к тому же устаревшие. Можете у меня в блоге посмотреть заметки о некоторых расширениях для эскулайт, но это для специалистов скорее интересно (и да, там тоже куски англоязычной переписки встречаются)
http://geomapx.blogspot.com/
...
Рейтинг: 0 / 0
sqLite и winApi
    #36109908
Eric-S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В основах юникода я разбираюсь.
Плохо понимаю заморочки с диакритическими знаками и сурагатными парами. Но с этим жить можно.

А вот програма у меня писана почти на чистом winApi. Ну и соответственно просит расширенные символы. Прогнуть это под utf-8 не представляеться возможным.
Разве что, сделать как я сейчас. Переходники на базе функций WideCharToMultiByte
и MultiByteToWideChar.


За наводки и ссылки благодарю. Надеюсь, что переборю свою тормознутость и разберусь. Мне в новом трудно разбераться, а хочеться всего и быстро.
Но проблема уже ушла из списка актуальных, поскольку оно у меня заработало. Так что буду ковырятся, когда появиться свободное время.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqLite и winApi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]