Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] Проблема с кодировкой


Автор: Maka6er 3.6.2008, 19:00
Есть БД sqlite. При вставке или извлечении текста на украинском языке возникают проблемы с кодировкой. Пробовал:
Код

QTextCodec *codec = QTextCodec::codecForName("KOI8-U");
QSqlQuery q = QSqlQuery();
q.exec("insert into words (wvalue) values('"+codec->fromUnicode(word)+"')");

Как решить данную проблему?

Автор: 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
Цитата(Elfebet @ 4.6.2008,  09:35)
 p.s. порыл в интернете, как поменять кодировку в Sqlite - не нашел :(

Она не меняется, задается один раз при создании базы. Перед созданием базы можно дать команду:

Код

PRAGMA encoding = "UTF-8";


В 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().

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)