Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: mokynis от Июнь 05, 2015, 09:08



Название: QString и национальный алфавит
Отправлено: mokynis от Июнь 05, 2015, 09:08
Программно формирую html-файл. В тексте используются буквы национального алфавита. В linux все отображается нормально, в windows-если просто перекомпилировать, то не проходит 1 буква, если предварительно заменяю символы, набранные в linux на символы из windows'овского Charachter Map, тогда вообще все символы преобразуются к похожим английским символам. Что я не так делаю?
(signs1.png) - вот так выглядит вывод откомпилированного без изменений приложения
(signs.png) - а так выглядят символы, введенные в самом windows


Название: Re: QString и национальный алфавит
Отправлено: Пантер от Июнь 05, 2015, 09:12
Не используй в коде символы кириллицы.


Название: Re: QString и национальный алфавит
Отправлено: gil9red от Июнь 05, 2015, 09:18
Файлы в кодировке utf-8 храните (без BOM)


Название: Re: QString и национальный алфавит
Отправлено: mokynis от Июнь 05, 2015, 10:12
Цитировать
Не используй в коде символы кириллицы.
это где там у меня хоть одна русская буква?
Цитировать
Файлы в кодировке utf-8 храните
не совсем понял, про какой файл идет речь. Если про сам .cpp, то он создавался в linux (я ж писал), там все в utf-8
если .html, так там charset=utf-8, а в какой кодировке сам файл-не важно. Так, собственно, QString уже на момент формирования содержит в себе не то, что нужно, так что, при чем тут файл?


Название: Re: QString и национальный алфавит
Отправлено: __Heaven__ от Июнь 05, 2015, 10:36
Цитировать
Не используй в коде символы кириллицы.
это где там у меня хоть одна русская буква?
буква ё


Название: Re: QString и национальный алфавит
Отправлено: __Heaven__ от Июнь 05, 2015, 10:37
Имхо, кирилицу и кракозябры необходимо хранить в отдельном файле. Либо txt, либо qm.


Название: Re: QString и национальный алфавит
Отправлено: Bepec от Июнь 05, 2015, 10:59
trUtf8() попробуйте использовать.


Название: Re: QString и национальный алфавит
Отправлено: mokynis от Июнь 05, 2015, 12:26
Цитировать
буква ё
там литовская буква ė (с одной точкой) ;-)
а насчет tr() я уже думал. Но там текст собирается в несколько приемов. Разве что
str1=tr("блаблабла");
str2=tr("манамана");
str1+=str2; ?
Попробую...
не-а, ничего не дало. Еще варианты есть?


Название: Re: QString и национальный алфавит
Отправлено: Hellraiser от Июнь 05, 2015, 13:59
Для передачи национальных символов используйте QString::fromUtf8 и исходники в UTF-8, не надо себе усложнять жизнь установкой кодеков.
Код:
QString my_string = QString::fromUtf8("бла-бла-бла");
И все-таки неплохо убедиться, что текст действительно сохранен в UTF-8.


Название: Re: QString и национальный алфавит
Отправлено: mokynis от Июнь 05, 2015, 15:23
вместо
Код:
QString str="\n___ĄČĖĘŠŪŽąčėęšūųž___\n";
написал
Код:
QString str=QString::fromUtf8("\n___ĄČĖĘŠŪŽąčėęšūųž___\n")
;ничего абсолютно не изменилось
А насчет того, как сохранен текст-так текст на QLabel сохранен в .exe-файле, какая там кодировка? Дело в том, что при отладке видно-переменная str сразу хранит не тот текст, что задается.
Да там весь код-то:
Код:
#include <QtGui>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec *codec=QTextCodec::codecForName("utf8");
    QTextCodec::setCodecForCStrings(codec);
    QTextCodec::setCodecForTr(codec);

    QString str="\n___ĄČĖĘŠŪŽąčėęšūųž___\n";
    QString strHtml="<html><head>"
                    "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"
                    "</head><body>"+str+"</body></html>";
    QLabel lbl;

    lbl.setText(str);
    lbl.show();

    QTextStream stream;
    QFile infile("try.html");
    if(!infile.open(QIODevice::WriteOnly))
        QMessageBox::warning(0,"Error","Can't open file",QMessageBox::Ok);
    else
    {
        stream.setDevice(&infile);   
        stream<<strHtml;
        infile.close();
        if(stream.status()!=QTextStream::Ok)
            QMessageBox::warning(0,"Error","Can't write to file",QMessageBox::Ok);
    }

    return a.exec();
}
Может с ним кто совладает? Что обидно-фактически не нормально отображается только буква Š большая. Чем она не угодила?


Название: Re: QString и национальный алфавит
Отправлено: Igors от Июнь 05, 2015, 15:39
Были проблемы с французской буквой "e". Короче сделал так:

- засекаю какая буква подается на вход и отображается неверно (2 байта в юникоде)
- в любом тестовом примере набираю "как должно быть нормально" (в IDE все работает) и опять засекаю эти 2 байта
- подменяю когда приходит текст

Как-то там "цивильно, через кодировку" - ну вот у меня "источник"  = текст из нативных ресурсов, поди угадай какая она там. Да и все эти setCodec в пятерке поубирали


Название: Re: QString и национальный алфавит
Отправлено: mokynis от Июнь 05, 2015, 15:55
Цитировать
Короче сделал так:
я дико извиняюсь-а можно поподробнее, а то ничего не понял. Я пытался вставить в строку QChar(0x0160) - это та самая Š. Не срабатывает


Название: Re: QString и национальный алфавит
Отправлено: Igors от Июнь 05, 2015, 16:09
Цитировать
Короче сделал так:
я дико извиняюсь-а можно поподробнее, а то ничего не понял. Я пытался вставить в строку QChar(0x0160) - это та самая Š. Не срабатывает
Вы засекли то что печатается неверно. Теперь пишете что-то типа
Код
C++ (Qt)
QString str("Bezier");  // слово в котором у меня были проблемы с первой "е"
qDebug() << str;       // убедимся это отображается как надо
printf("str[1] = 0x%x\n", (int) str[1].unicode());   // нужный код
Для поиска "неверной" буквы - процедура та же


Название: Re: QString и национальный алфавит
Отправлено: sociopath от Июнь 07, 2015, 02:33
Код:
    QTextStream stream;
    QFile infile("try.html");
    if(!infile.open(QIODevice::WriteOnly))
        QMessageBox::warning(0,"Error","Can't open file",QMessageBox::Ok);
    else
    {
        stream.setDevice(&infile);   
        stream<<strHtml;
        infile.close();
        if(stream.status()!=QTextStream::Ok)
            QMessageBox::warning(0,"Error","Can't write to file",QMessageBox::Ok);
    }
Удивительно, что он вообще что-то умудряется под виндовой локалью кроме кракозябр вывести с таким кодом.

На помощь нам как всегда приходит дока.
Раз:
Цитировать
QTextStream & QTextStream::operator<<(const QString & string)
Writes the string string to the stream, and returns a reference to the QTextStream. The string is first encoded using the assigned codec (the default codec is QTextCodec::codecForLocale()) before it is written to the stream.
Два:
Цитировать
void QTextStream::setCodec(const char * codecName)
Sets the codec for this stream to the QTextCodec for the encoding specified by codecName. Common values for codecName include "ISO 8859-1", "UTF-8", and "UTF-16". If the encoding isn't recognized, nothing happens.

Example:
Цитировать
QTextStream out(&file);
out.setCodec("UTF-8");


Название: Re: QString и национальный алфавит
Отправлено: kambala от Июнь 07, 2015, 03:26
ну вот у меня "источник"  = текст из нативных ресурсов, поди угадай какая она там.
можно попробовать угадать через +[NSString stringWithContentsOfFile:usedEncoding:error:], но грузить надо из файла


Название: Re: QString и национальный алфавит
Отправлено: Igors от Июнь 07, 2015, 10:14
можно попробовать угадать через +[NSString stringWithContentsOfFile:usedEncoding:error:], но грузить надо из файла
То если текст задуман как национальный. Но сам по себе он может быть просто английский + какие-то еще буквы (напр значок копирайта, "верхние" (нижние) кавычки) вот с ними возможны проблемы.


Название: Re: QString и национальный алфавит
Отправлено: mokynis от Июнь 08, 2015, 15:23
Спасибо всем за помощь. Особенно gil9red и Hellraiser - ведь долбали же, чтобы обратил внимание на кодировку исходников. Точно, в винде в свойствах проекта стояло "сохранять в системной кодировке". Все получилось


Название: Re: QString и национальный алфавит
Отправлено: gil9red от Июнь 08, 2015, 20:49
 ;)