| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] Проблема с кодировкой |
| Автор: Maka6er 3.6.2008, 19:00 | ||
Есть БД sqlite. При вставке или извлечении текста на украинском языке возникают проблемы с кодировкой. Пробовал:
Как решить данную проблему? |
| Автор: anatox91 3.6.2008, 19:35 |
| http://forum.vingrad.ru/forum/topic-214051/kw-кодировка-текст-ввод-данных.html что-то подобное |
| Автор: Maka6er 3.6.2008, 19:59 |
| Смотрел, но непомогло. Там база mysql. То решение как я понял: 1. Выставить кодировку для базы данных в Utf-8 2. Для теста дать команду "SET NAMES utf8;" В sqlite "SET NAMES utf8;" не работает. А как выставить кодировку не знаю. |
| Автор: Elfebet 4.6.2008, 09:35 |
| в указаном anatox91, топике написано, что кодировку можно не менять, в QT и SqlLite изначально работает с кодировкой Utf-8. в твоем коде написано что ты тексту присвоил кодировку KOI8-U и записал в базу, а в базе кодировка стоит Utf-8, по этому и кракозяблики. p.s. порыл в интернете, как поменять кодировку в Sqlite - не нашел :( |
| Автор: Maka6er 4.6.2008, 10:33 |
| Спасибо за ответы. Проблема решилась. Программа для администрирования sqlite работала с непонятной кодировкой. Делаю просто fromLocal8Bit() и в моей проге все работает. |
| Автор: SABROG 4.6.2008, 12:16 | ||||
Она не меняется, задается один раз при создании базы. Перед созданием базы можно дать команду:
В Qt используюется функция sqlite3_open16() для создания базы, а это автоматически устанавливает кодировку UTF-16 для каждой новой базы данных. Если надо поменять кодировку базы, то можно дать команду "PRAGMA encoding = "UTF-8";" сразу после вызова QSqlDatabase.open(), но я бы лишний раз подумал, а надо ли это делать. Почему объясню ниже. Если текст на украинском языке и вводится в графические компоненты Qt, то он уже в Unicode 4.0 (я ошибался, когда говорил, что он в Utf-8, это всего-лишь одно из представлений Unicode) кодировке и его можно вставлять в базу, извлекать и отображать в Qt приложении без проблем. Qt конвертит QString в представление Utf-16 и передает в SQLITE через функцию sqlite3_bind_text16. Если база в Utf-8 кодировке, то SQLITE сам конвертит переданный текст в Utf-16 в Utf-8. Кстати это может быть одним из узких мест в драйвере Qt для работы с базой sqlite, поэтому может быть есть смысл все-таки использовать кодировку Utf-16, не смотря на то, что размер базы может увеличиться в 2 раза. Ну или не использовать Qtшный sql драйвер, а работать с sqlite напрямую. Если текст берется из текстового файла или из другого источника, то его нужно предварительно перевести в unicode, только в этом случае нам нужна функция QTextCodec::codecForName() и QTextCode::toUnicode(). |