crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Петр91
  опции профиля:
сообщение 18.9.2011, 8:16
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 10.6.2011
Пользователь №: 2731

Спасибо сказали: 0 раз(а)




Репутация:   0  


Опишу проблему и задачу в целом. Пользователь вводи русскую букву, а вы водиться третья буква от введеной пользователем. Т.е введенный вользовательский символ записывается в переменную, узнается код символа, и прибавляется число три допустим. Проблема возникла с кодировкой. раньше я прописывал
#ifdef Q_OS_WIN32
QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr( codec );
QTextCodec::setCodecForCStrings( codec );
QTextCodec::setCodecForLocale( codec );
#endif

А сейчас ничего что то не работает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.9.2011, 8:27
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Если речь идёт о Qt, то и тему нужно создавать в разделе посвещённом Qt.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 18.9.2011, 9:52
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Попробуйте использовать UTF-8.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Петр91
  опции профиля:
сообщение 18.9.2011, 10:13
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 10.6.2011
Пользователь №: 2731

Спасибо сказали: 0 раз(а)




Репутация:   0  


Блин помогите! Я писал в консоли, а сейчас в гуи не могу перенести. Есть два text edit в одном текст открытый а в другом *зашифрованный*. Пишем открытый текст и он тут же шифруется, заменой текущей буквой на букву стоящей через 3. Я не могу разобраться с QString. ДА и вообще. Мне надо весь текст из text edita записывать в переменную, потом для каждого кода символа прибавить три. И отправить все в text edit. Я не могу из text edita получить текст. Идея такая:
char *p = new char;
при изменении текста
cin>>(вот тут из text edita)>> p;
int i=0;
int tr;
while(p[i]!='\0')
{
tr=(int)(p[i]);
p[i]=(char)(tr+3);
}
отправка в text edit2.
Подскажите!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Петр91
  опции профиля:
сообщение 18.9.2011, 11:18
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 10.6.2011
Пользователь №: 2731

Спасибо сказали: 0 раз(а)




Репутация:   0  


Простите за флуд! Спасибо, разобрался во всем. UTF-8 кодировка помогла

Простите за флуд! Спасибо, разобрался во всем. UTF-8 кодировка помогла
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Петр91
  опции профиля:
сообщение 19.9.2011, 4:33
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 10.6.2011
Пользователь №: 2731

Спасибо сказали: 0 раз(а)




Репутация:   0  


И все таки снова проблема!! Имеется два текст эдит, в одном пишем символы в другом код символа. Вот код
main.cpp

#ifdef Q_OS_WIN32
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr( codec );
QTextCodec::setCodecForCStrings( codec );
QTextCodec::setCodecForLocale( codec );
#endif

shifr.cpp

void shifr::on_textEdit_textChanged()
{

F = this->ui->textEdit->toPlainText(); //В переменную F записываем текст
int i = F.length(); // Узнаем длину строки

QByteArray ar = F.toUtf8();
char *p = ar.data(); //QString to char

int tr = (int)(p[i-1]); //Узнаем код последнего символа

F = QString::number(tr); //Int to QString
this->ui->textEdit_2->setText(F); //Выводим
}

С английскими символами все ок. A 97, B 98 и т.д. НО с русскими гг получается. Пишу русский символ А выводиться число -48, пишу еще раз А выводиться -80, потом все снова повторяется.с Б так же только -48 -79 с буквой Р -47 -128. Мне нужно чтобы код русс символов был последователен, и почему два числа постоянно меняются О.о
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssoft
  опции профиля:
сообщение 19.9.2011, 9:10
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 130
Регистрация: 17.2.2010
Из: Москва
Пользователь №: 1470

Спасибо сказали: 30 раз(а)




Репутация:   3  


UTF-8 для кодировки не латинских букв использует больше чем 1 байт.

Можно (и нужно) нарямую работать с текстовым кодеком.
Например.

void shifr::on_textEdit_textChanged()
{
    static const QTextCodec * codec = QTextCodec::codecByName( "cp1251" );

    F = this->ui->textEdit->toPlainText(); //В переменную F записываем текст
    int i = F.length(); // Узнаем длину строки

    QByteArray ar = codec->fromUnicode( F );
    char tr = ar.at( i - 1 );

    F = QString::number( tr ); //Int to QString
    this->ui->textEdit_2->setText( F ); //Выводим
}


чтобы "зашифровать" символ

void shifr::on_textEdit_textChanged()
{
    static const QTextCodec * codec = QTextCodec::codecByName( "cp1251" );

    F = this->ui->textEdit->toPlainText(); //В переменную F записываем текст
    int i = F.length(); // Узнаем длину строки

    QByteArray ar = codec->fromUnicode( F );
    ar[ i - 1 ] += 3;

    QString new_text = codec->toUnicode( ar );
    this->ui->textEdit_2->setText( new_text ); //Выводим
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.9.2011, 9:53
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Петр91 @ 19.9.2011, 7:33) *
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr( codec );
QTextCodec::setCodecForCStrings( codec );
QTextCodec::setCodecForLocale( codec );
это избыточно и опасно.
Первая установка, кроме как на tr() и trUtf8() ни на что влиять не будет.
Вторая будет влиять на все Си-строки (строковые литералы), например при работе с БД (и могут возникнуть проблемы)
Третья - кодек локали, в случае если кодек локали отличается от системной - головники почти гарантированы.

Цитата(ssoft @ 19.9.2011, 12:10) *
Можно (и нужно) нарямую работать с текстовым кодеком.
солидарен
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Петр91
  опции профиля:
сообщение 20.9.2011, 13:52
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 10.6.2011
Пользователь №: 2731

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо большое, за пример с объяснениями!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 22.6.2025, 21:47