Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: svictor от Февраль 26, 2006, 16:52



Название: Как получить "русский" char* из QString
Отправлено: 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). Если текст английский, то все работает. Как сделать, чтобы русский текст тоже работал?


Название: Как получить "русский" char* из QString
Отправлено: Asaphus_Expansus от Февраль 26, 2006, 18:25
1.
    QString *qStr = new QString(QString::fromUtf8("Привет!"));
    QByteArray qBa = qStr->toLocal8Bit();

2. Файл исходников сохранять как utf8


Название: Как получить "русский" char* из QString
Отправлено: svictor от Февраль 27, 2006, 08:21
Проверил. Теперь на каждый русский байт формируется два байта, а нужно один в досовской кодировке. Просто нужно передать текст по СОМ порту, чтобы его поняла прога, работающая под виндой. С английским нет проблемм, а с русским как обычно ... :)


Название: Как получить "русский" char* из QString
Отправлено: Sergeich от Февраль 27, 2006, 10:48
Код:
QTextCodec::setCodecForCStrings( QTextCodec::codecForName("utf8") );
QString tmp = "Привет";
QCString res = QTextCodec::codecForName("IBM866")->fromUnicode( tmp );

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


Название: Как получить "русский" char* из QString
Отправлено: svictor от Февраль 27, 2006, 13:26
Что-то не хочет получаться :(  Говорит что QCSting вообще нету. В Qt Assistant нашел, что fromUnicode возращает QByteArray. Но и он ничего хорошего не выдал.


Название: Как получить "русский" char* из QString
Отправлено: Asaphus_Expansus от Февраль 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();


Название: Как получить "русский" char* из QString
Отправлено: Dendy от Февраль 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();


Название: Как получить "русский" char* из QString
Отправлено: Вудруф от Февраль 28, 2006, 11:08
Цитата: "svictor"
Проверил. Теперь на каждый русский байт формируется два байта, а нужно один в досовской кодировке. Просто нужно передать текст по СОМ порту, чтобы его поняла прога, работающая под виндой. С английским нет проблемм, а с русским как обычно ... :)

Логично, в UTF8 русские буквы будут сохраняться двумя байтами...


Название: Как получить "русский" char* из QString
Отправлено: svictor от Март 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). А есть ли другие способы работать с СОМ портом? Хочется проверить ради спортивного интереса.


Название: Как получить "русский" char* из QString
Отправлено: psj от Март 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 естественно.


Название: Как получить "русский" char* из QString
Отправлено: Dendy от Март 04, 2006, 14:32
Структура DOM пишется в файл через QTextStream. Должно работать так:

Код:
QTextStream ts( &file );
ts.setCodec( QTextCodec::codecForName( "Windows-1251" ) );
document.save( ts, 0 );