|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
Доброго дня. Пытаюсь на Маке сохранить в базе данных предложение на русском языке. В базе данных получаю закорючки. По всем документациям выходит, что SQLite поддерживает UTF-8, более того, если создать sql файл в UTF-8 с содержанием Код: plaintext
На всякий случай, вот кусок кода, которым я вставляю предложения в бд: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Может, кто знает, в чем дело и как с этим бороться? Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 14:54 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
IbolitМожет, кто знает, в чем дело и как с этим бороться?Убеди свою прогу что надо работать в UTF8. Только и всего :) Насколько ты уверен, что странная переменная "[string UTF8String]" это действительно UTF8 строка? Оно должно в памяти храниться как UTF8. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 18:42 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
[string UTF8String] это не странная переменная. Это вызов метода UTF8String у объекта string. В Objective-C вызов метода у объекта (а точнее, отправка ему сообщения) оформляется при помощи квадратных скобок. А суть этого метода в том, что он возвращает Сишную строку в кодировке UTF-8, т.е. массив символов, заканчивающийся NULL-ом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 20:06 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
Ibolit[string UTF8String] это не странная переменная. Это вызов метода UTF8String у объекта string. В Objective-C вызов метода у объекта (а точнее, отправка ему сообщения) оформляется при помощи квадратных скобок. А суть этого метода в том, что он возвращает Сишную строку в кодировке UTF-8, т.е. массив символов, заканчивающийся NULL-ом.ааа.... ну извините, с этим зверем (Objective-C) я пока еще ни разу не работал. Но вообще-то, отдавать результат метода в bind это чревато. Метод UTF8String вызывается в момент когда делается привязка (sqlite3_bind_text()) В этот момент времени результат метода действительно будет содержать то что просили. Но привязка переменных это вещь размазанная по времени. Данные по этому указателю будут использованы намного позднее, (во время sqlite3_step). Насколько ты уверен что между bind() и отдельными step() метод [string UTF8String] будет возвращать указатель на один и тот же кусок памяти? В какой момент библиотека делает конвертацию string из своего внутреннего формата в zero-terminated UTF8? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 20:16 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
Да дело в том, что я пытался и сначала это дело присваивать переменной, а потом отправлять ее в bind. Код: plaintext 1. 2.
И тот же самый результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 20:51 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
IbolitДа дело в том, что я пытался и сначала это дело присваивать переменной, а потом отправлять ее в bind. Код: plaintext 1. 2.
И тот же самый результат.Ну это тоже самое что и прямое использование метода в bind. Попробуй в этом варианте скидывать тексты по указателю cString и [string UTF8String] в лог между bind() и каждым step(). Увидишь что происходит... Bind() можно делать только на неперемещаемый кусок памяти. В конце-концов тебе очень надо делать привязку? Намного проще и надежнее формировать sql команду без параметров и запускать ее напрямую. Привязка нужна только если ты делаешь множество вызовов одной и той-же команды. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2009, 21:13 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
Как оказалось, ошибка была в другой части кода. Все на самом деле вставляется правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2009, 02:22 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
White OwlДанные по этому указателю будут использованы намного позднее, (во время sqlite3_step). Насколько ты уверен что между bind() и отдельными step() метод [string UTF8String] будет возвращать указатель на один и тот же кусок памяти? sqlite3_bind_text(... SQLITE_TRANSIENT ) т.е. в момент вызова склайтом будет создана копия строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2009, 10:08 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
Dmitry ArefievWhite OwlДанные по этому указателю будут использованы намного позднее, (во время sqlite3_step). Насколько ты уверен что между bind() и отдельными step() метод [string UTF8String] будет возвращать указатель на один и тот же кусок памяти? sqlite3_bind_text(... SQLITE_TRANSIENT ) т.е. в момент вызова склайтом будет создана копия строки.Да, действительно. Я сам всегда использую SQLITE_STATIC, даже не подумал посмотреть на последний параметр... Вот ведь. А кстати, зачем этот SQLITE_TRANSIENT вообще придуман? Какой смысл делать копию подставляемой переменной? Ее же потом подставлять нельзя, весь смысл привязки теряется. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2009, 17:00 |
|
SQLite, insert, Mac, русские кодировки
|
|||
---|---|---|---|
#18+
White OwlА кстати, зачем этот SQLITE_TRANSIENT вообще придуман? Какой смысл делать копию подставляемой переменной? Не всегда есть возможность/желание/и т.д. иметь выделенный буфер со сроком жизни как у препарированной команды. Вот тогда и нужен SQLITE_TRANSIENT. White OwlЕе же потом подставлять нельзя, весь смысл привязки теряется. Смысл не теряется - команда не требует повторного разбора. А для повторной передачи значения необходимо вызвать sqlite3_bind_text с другим значением. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2009, 20:14 |
|
|
start [/forum/topic.php?fid=54&msg=35918709&tid=2009458]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 320ms |
total: | 502ms |
0 / 0 |