Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Ввод текстовых данных на русском языке, как получить данные в нужной кодировке 
V
    Опции темы
VirLena
Дата 29.5.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.5.2007
Где: Украина

Репутация: нет
Всего: нет



У меня в приложении несколько QLineEdit в которые вводится текст на русском языке. Я беру введенные данные и пересохраняю в базу данных, где все введенные данные почему-то отображаются в виде "????". Программирую в Qt под Linux недавно, потому недопонимаю что не так делаю. 
Я считала, что данные вводятся в utf8 при русской раскладке клавиатуры, потому делала так

Код

QTextCodec * codec = QTextCodec::codecForName("KOI8-R");

QString tmp = codec->fromUnicode(Name->text());


где Name - QLineEdit *Name, а tmp затем помещается в базу данных через QMYSQL, но видимо ошиблась.

Вообщем ничего не получается. За помощь буду благодарна )).


PM MAIL ICQ   Вверх
JackYF
Дата 29.5.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Цитата(VirLena @  29.5.2008,  15:58 Найти цитируемый пост)
считала, что данные вводятся в utf8

Цитата(VirLena @  29.5.2008,  15:58 Найти цитируемый пост)
KOI8-R

не коррелирует, не находишь? может, всё-таки UTF-8?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
VirLena
  Дата 30.5.2008, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.5.2007
Где: Украина

Репутация: нет
Всего: нет



Вообщем поскольку до меня не доходит попытаюсь обьяснить пошагово, может мне тоже кто-нить ответит также подробно.
 
В linux в kde я выбираю русскую раскладку клавиатуры, и ввожу текст на русском языке, считая что мое приложение получает этот текст в кодировке utf8, затем  с помощью 

Код

QTextCodec * codec = QTextCodec::codecForName("KOI8-R");
QString tmp = codec->fromUnicode(Name->text());


перевожу из utf8 в koi8-R и в таком виде отправляю в базу данных, при считывании из базы данных я делаю обратное преобразование из koi8-r в utf8, но получаю абракадабру, да и просто при просмотре базы данных я вижу, что все записи кодированы.
Я знаю, что что-то делаю не так, я не пойму что именно. Как мне в приложении сделать поддержку ввода русского текста, потому что если данные вводить латиницей никаких проблем не возникает.

Еще в книге я прочитала:

Цитата

 При каждом нажатии на клавишу микропроцессор клавиатуры генерирует
последовательность так называемых скан-кодов, которая представляет собой
последовательность из двух или большего числа байтов. Эта последовательность передается драйверу клавиатуры, который может работать в одном из 4 режимов.
 При работе в системе X Window клавиатура передает этой системе чистые скан-коды. Клавиатурный модуль Х-сервера передает сообщение о нажатии (и отпускании) кнопки прикладной программе. В этом сообщении указывается только скан-код нажатой кнопки и
"состояние клавиатуры" -- набор битовых "флагов", который отражает состояние клавиш-модификаторов (<Shift>, <Ctrl>, <Alt>, <Caps Lock> и т. п.). "Клиентская" программа должна сама решить — какой код символа, соответствующий скан-коду, надо выбрать при таком сочетании битов-модификаторов. Разумеется, при создании программ никто не пишет каж-
дый раз программу для интерпретации скан-кодов. Для этих целей существуют специальные подпрограммы в библиотеке X-Lib. Процедуры из X-Lib, зная скан-код и "состояние клавиатуры", выбирают подходящий символ в соответствии с таблицей символов, которая хранится в Х-сервере и которую они обычно "запрашивают" у Х-сервера при старте программы.


Значит ли это, что моя программа должна содержать еще какие-то дополнительные библиотеки, или это не относится к моему вопросу?
PM MAIL ICQ   Вверх
Elfebet
Дата 30.5.2008, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Не надо переводить вдругую кодировку, попробуй без перевода.
Обычно БД всегда хранит данные в utf8.

этот перевод лишний. оно?

Цитата(VirLena @  30.5.2008,  08:50 Найти цитируемый пост)
Еще в книге я прочитала:

это не в тему, к вопросу оно не относится.

Это сообщение отредактировал(а) Elfebet - 30.5.2008, 09:16


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
VirLena
  Дата 30.5.2008, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.5.2007
Где: Украина

Репутация: нет
Всего: нет



Я пробывала и без перевода, параллельно с сохранением в базу данных вывожу текст на экран, на экран выводит нормально, в базе вся инфа кодирована. 

Кстати, если я в базу данных ввожу информацию через командную строку MySql на русском, все данные корректны, и если я потом вывожу их на экран своего приложения мне приходиться делать преобразование koi8 в utf8 иначе ничего не получается, поэтому я и подумала, что необходима перекодировка при вводе из приложения в базу данных.
PM MAIL ICQ   Вверх
SABROG
Дата 30.5.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Смотри. Вот есть исходник, он сохранен в кодировке cp1251. У тебя может быть Koi8-R, если компилятор поймет (например mingw'шный gcc не понимает двубайтовых и более кодировок):

Код

lineEdit->setText("Текст в кодировка cp1251");


В поле будут иероглифы, т.к. Qt думает, что текст в Utf-8. При этом если я буду вводить русский текст непосредственно в поле и раскладка будет стоять русской, то текст будет виден нормально, это потому, что Qt сам конвертирует вводимый текст в Utf-8. Отсюда имеем - все что вводится вручную в графические компоненты имеет кодировку Utf-8 при попытке считать данные.

Насчет mysql. Помимо кодировки базы данных, есть еще кодировка клиента. Например консольный клиент windows, который идет в стандартной поставке mysql может показывать и вставлять текст в кодировке cp866, а в другой версии windows для консоли может стоять unicode. Поэтому на разных машинах данные из одной базы могут отображаться разными иероглифами.

Что следует сделать:
1. Выставить кодировку для базы данных в Utf-8
2. Для теста дать команду "SET NAMES utf8;", чтобы MySQL сервер начал считать, что данные (INSERT) и результат (SELECT) приходят и выводятся в Utf-8 кодировке (не смотря на установленную кодировку базы данных). Но по умолчанию вставляемые данные должны интерпретироваться как Utf-8, а принимаемые/выводимые в зависимости от той кодировке, что ты установила для базы данных.
Т.е. ты в праве сказать MySQL серверу, что я буду передавать данные в Koi-8R, но ты их сохрани в Utf-8 кодировке в базу.

Естественно, что в этом нет смысла, поэтому надо удалить:

Код

QTextCodec * codec = QTextCodec::codecForName("KOI8-R");
QString tmp = codec->fromUnicode(Name->text());


Это сообщение отредактировал(а) SABROG - 30.5.2008, 12:35


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
VirLena
Дата 2.6.2008, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 21.5.2007
Где: Украина

Репутация: нет
Всего: нет



спасибо всем за помощь
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0860 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.