|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Здравствуйте! Хочу использовать в программе 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. Ясно, что я ещё не догуглился. А вот что именно искать, то и не пойму. Будте добреньки, расскажите! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 12:21 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Надо использовать функции, которые оканчиваются на 16. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 12:55 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Компилер ругаеться src\modules/authors.cpp:21: error: `sqlite3_exec16' was not declared in this scope Может ещё чего нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 13:02 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
sqlite3_exec и многие другие без текстовых аргументов существуют только в одном варианте. Большинство функций с текстовыми аргументами, например sqlite3_prepare существуют в двух вариантах - просто и с 16 на конце имени. Точнее - RTFM. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 13:13 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Мой английский плох. Но я всё же заглянул в официальную документацию. sqlite3_exic действительно только одна. http://sqlite.org/c3ref/exec.html И вроде бы она возвращяет всё в utf-8. А значит ещё нужно конвертить полученный результат. Ну а как добавить новую запись? Да и как из utf-8 лучше преобразовать? Вроде бы winApi multibiteToWideChar только с ansi работают? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 13:19 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Ок! Переписал функцию так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
И всё равно хрень выводиться. А ведь я в базу скидывал пока только латинские буковки. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 13:57 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Ой, нет - вру. Выводиться. Надо было поставить префикс, перед строкой sqlite3_open16( L"midata.db", &db ); Радует. Надо теперь русские буковки попробовать. А вставлять записи надо тоже в utf-8 кодировке? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 14:05 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Eric-SОй, нет - вру. Выводиться. Надо было поставить префикс, перед строкой sqlite3_open16( L"midata.db", &db ); Радует. Надо теперь русские буковки попробовать. А вставлять записи надо тоже в utf-8 кодировке? А почему вы не хотите хранить данные и работать с ними в единой кодировке? SQLite позволяет хранить как utf18, так и utf8. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 16:25 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
А кто сказал, что я не хочу в единой кодировке? Просто я читая мануал, догадался что мне выводиться в utf-8. Из чего я и решил, что мне нужно его как-то конвертировать. Я только сегодня вообще взялся за этот sqLite. Вопрос же в первом посте. Ещё раз переформулирую его. Как мне читать и писать данные WCHAR, в sqLite? Кстати, кирилица у меня не заработала. Когда я в консоли добавляю и проверяю руские буковки, то всё ок. Когда же читаю в программе, то одни вопросики. Из чего я делаю вывод, что либо я конвертирую не правильно. Либо в консоли не конвертируеться вообще. Сейчас делаю функцию добавления записи в базу. Вот и узнаем, где глюк. А если кто объяснит, где собаку закопать, то буду благодарен! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 17:58 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
MBGА почему вы не хотите хранить данные и работать с ними в единой кодировке? SQLite позволяет хранить как utf16, так и utf8. Пожалуйста объясните, как выставлять кодировку хранения, как писать и как читать в utf-16. Для меня это наиболее удобный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 18:03 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Eric-SMBGА почему вы не хотите хранить данные и работать с ними в единой кодировке? SQLite позволяет хранить как utf16, так и utf8. Пожалуйста объясните, как выставлять кодировку хранения, как писать и как читать в utf-16. Для меня это наиболее удобный вариант. Формат хранения: Код: plaintext 1. 2. 3. 4.
Возвращаемые значения: Код: plaintext 1. 2. 3.
Как видите, эскулайт умеет сам все перекодировать, вам остается только выбрать нужное. Как пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Здесь результат будет в 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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2009, 18:33 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
Не понял! Это вообще куда подключать? Я использую sqlite3_exec() и она вызывает calback функцию. А других способов и не знаю. И куда мне прикручивать всякие sqlite3_result_text16? Ладно, с чтением я сяма всё раскодирую. Да и при вставке могу закодировать. Но это же изврат! Вот в мускуле mysql_setcharset и зашибись. В прочем, здесь же на форуме, ещё одна тема http://www.sql.ru/forum/actualthread.aspx?tid=540148 Похожая проблема. И тоже без конкретики. Ладно. Я ещё попробую сам поискать. А рассылка - она же английская! Я в мануале-то путаюсь... Или может есть рускоязычные ресурсы по sqlite? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2009, 13:52 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
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/ ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2009, 20:54 |
|
sqLite и winApi
|
|||
---|---|---|---|
#18+
В основах юникода я разбираюсь. Плохо понимаю заморочки с диакритическими знаками и сурагатными парами. Но с этим жить можно. А вот програма у меня писана почти на чистом winApi. Ну и соответственно просит расширенные символы. Прогнуть это под utf-8 не представляеться возможным. Разве что, сделать как я сейчас. Переходники на базе функций WideCharToMultiByte и MultiByteToWideChar. За наводки и ссылки благодарю. Надеюсь, что переборю свою тормознутость и разберусь. Мне в новом трудно разбераться, а хочеться всего и быстро. Но проблема уже ушла из списка актуальных, поскольку оно у меня заработало. Так что буду ковырятся, когда появиться свободное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2009, 02:36 |
|
|
start [/forum/topic.php?fid=54&msg=36107596&tid=2009440]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 183ms |
0 / 0 |