Russian Qt Forum
Ноябрь 26, 2024, 15:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить "русский" char* из QString  (Прочитано 21981 раз)
svictor
Гость
« : Февраль 26, 2006, 16:52 »

QT 4.1 Привожу фрагмент кода

  char *ch;
  QByteArray qBa;
  QString *qStr= new QString(QString::fromUtf8("ПРИВЕТ"));
  qBa = qStr->toAscii();
  ch = qBa.data();

 В результате одни вопросы (код байта 63). Если текст английский, то все работает. Как сделать, чтобы русский текст тоже работал?
Записан
Asaphus_Expansus
Гость
« Ответ #1 : Февраль 26, 2006, 18:25 »

1.
    QString *qStr = new QString(QString::fromUtf8("Привет!"));
    QByteArray qBa = qStr->toLocal8Bit();

2. Файл исходников сохранять как utf8
Записан
svictor
Гость
« Ответ #2 : Февраль 27, 2006, 08:21 »

Проверил. Теперь на каждый русский байт формируется два байта, а нужно один в досовской кодировке. Просто нужно передать текст по СОМ порту, чтобы его поняла прога, работающая под виндой. С английским нет проблемм, а с русским как обычно ... Улыбающийся
Записан
Sergeich
Гость
« Ответ #3 : Февраль 27, 2006, 10:48 »

Код:
QTextCodec::setCodecForCStrings( QTextCodec::codecForName("utf8") );
QString tmp = "Привет";
QCString res = QTextCodec::codecForName("IBM866")->fromUnicode( tmp );

Далее res можно использовать как const char*
Записан
svictor
Гость
« Ответ #4 : Февраль 27, 2006, 13:26 »

Что-то не хочет получаться Грустный  Говорит что QCSting вообще нету. В Qt Assistant нашел, что fromUnicode возращает QByteArray. Но и он ничего хорошего не выдал.
Записан
Asaphus_Expansus
Гость
« Ответ #5 : Февраль 27, 2006, 14:25 »

Если нужно DOS кодировку то

    при сохранении в utf8
    QString qStr = QString::fromUtf8("Привет!")

    при сохранении в виндовой кодировке
    QString qStr = QString::fromLocal8Bit("Привет!");

    QByteArray qBa = QTextCodec::codecForName("IBM866")->fromUnicode( qStr );
    const char* ptr = qBa.data();
Записан
Dendy
Гость
« Ответ #6 : Февраль 27, 2006, 19:53 »

Цитата: "Sergeich"
Код:
QTextCodec::setCodecForCStrings( QTextCodec::codecForName("utf8") );
QString tmp = "Привет";
QCString res = QTextCodec::codecForName("IBM866")->fromUnicode( tmp );

Далее res можно использовать как const char*


Очевидно svictor пользуется Qt 4, а не Qt 3. В Qt 4 QByteArray работает и как массив байтов, и как с-строка.

В коде писать не-латиницей - плохой стиль. Неважно какая задача. Лучше сохрани текстьІ в отдельном файле (можно даже заюзать средства Qt Linguist) и в коде пользоваться:

Код:
QByteArray c_string = unicode_string.toLocal8Bit();
const char * data = c_string.constData();


Если не уверен какая кодировка используется для локали - смотри:

Код:
QTextCodec::setCodecForLocale();
Записан
Вудруф
Гость
« Ответ #7 : Февраль 28, 2006, 11:08 »

Цитата: "svictor"
Проверил. Теперь на каждый русский байт формируется два байта, а нужно один в досовской кодировке. Просто нужно передать текст по СОМ порту, чтобы его поняла прога, работающая под виндой. С английским нет проблемм, а с русским как обычно ... Улыбающийся

Логично, в UTF8 русские буквы будут сохраняться двумя байтами...
Записан
svictor
Гость
« Ответ #8 : Март 01, 2006, 09:28 »

Большое всем спасибо за подсказки! Все заработало.

Вначале программы вставил (для того чтобы шла кириллица):

     QTextCodec::setCodecForCStrings( QTextCodec::codecForName("utf8") );

На передачу используется следующий код (воспользовался правилом хорошего тона Улыбающийся - ввожу текст через lineEdit)
  QString qStr =  ui.lineEdit->text();
  QByteArray qBa = qStr.toAscii();
  char *ch = qBa.data();

А на прием:
  char chBuff[2];
  chBuff[1] = 0;
  int iSize = qPort->size();
  for(int i = 0; i < iSize; i++)
  {
    chBuff[0] = qPort->getch();
    ui.textEdit->textCursor().insertText(QString::fromAscii(chBuff));
  }

qPort - это объект класса QextSerialPort (скачал с сайта http://qextserialport.sourceforge.net/ и адаптировал под Qt4.1). А есть ли другие способы работать с СОМ портом? Хочется проверить ради спортивного интереса.
Записан
psj
Гость
« Ответ #9 : Март 04, 2006, 13:52 »

столкнулся с подобной проблемой и ничего не получается! Грустный
необходимо в xml-file писать русские слова в кодировке utf8. Задача  такая. xml создается, НО в него все пишется в UTF-8 кодировке. Несколько раз перечитал и перепробовал пост - ничего не получилось.
Win XP, QT 4.1.0, MinGW
Собственно, в поле пишется русский текст и его же пытаюсь сохранить в xml.
Код:

QTextCodec::setCodecForCStrings( QTextCodec::codecForName("utf8") );
QString qStr = ui.leFROM1->text();
QByteArray qBa = qStr.toAscii();
const char* ptr = qBa.data();
//
tag.setAttributeNode (doc.createAttribute("FROM"));
tag.setAttribute("FROM", ptr);
doc.save(out, IndentSize);

в итоге получается абракадабра.
Если не перекодировать, то все нормально но все в UTF-8 естественно.
Записан
Dendy
Гость
« Ответ #10 : Март 04, 2006, 14:32 »

Структура DOM пишется в файл через QTextStream. Должно работать так:

Код:
QTextStream ts( &file );
ts.setCodec( QTextCodec::codecForName( "Windows-1251" ) );
document.save( ts, 0 );
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 21.