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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QString и национальный алфавит  (Прочитано 18482 раз)
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« : Июнь 05, 2015, 09:08 »

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

QT4, Qt5, Qt6 Debian, ArchLinux
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Июнь 05, 2015, 09:12 »

Не используй в коде символы кириллицы.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Июнь 05, 2015, 09:18 »

Файлы в кодировке utf-8 храните (без BOM)
Записан

mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #3 : Июнь 05, 2015, 10:12 »

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

QT4, Qt5, Qt6 Debian, ArchLinux
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Июнь 05, 2015, 10:36 »

Цитировать
Не используй в коде символы кириллицы.
это где там у меня хоть одна русская буква?
буква ё
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Июнь 05, 2015, 10:37 »

Имхо, кирилицу и кракозябры необходимо хранить в отдельном файле. Либо txt, либо qm.
Записан
Bepec
Гость
« Ответ #6 : Июнь 05, 2015, 10:59 »

trUtf8() попробуйте использовать.
Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #7 : Июнь 05, 2015, 12:26 »

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

QT4, Qt5, Qt6 Debian, ArchLinux
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Июнь 05, 2015, 13:59 »

Для передачи национальных символов используйте QString::fromUtf8 и исходники в UTF-8, не надо себе усложнять жизнь установкой кодеков.
Код:
QString my_string = QString::fromUtf8("бла-бла-бла");
И все-таки неплохо убедиться, что текст действительно сохранен в UTF-8.
Записан
mokynis
Самовар
**
Offline Offline

Сообщений: 176


Просмотр профиля
« Ответ #9 : Июнь 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();
}
Может с ним кто совладает? Что обидно-фактически не нормально отображается только буква Š большая. Чем она не угодила?
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 05, 2015, 15:39 »

Были проблемы с французской буквой "e". Короче сделал так:

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

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

Сообщений: 176


Просмотр профиля
« Ответ #11 : Июнь 05, 2015, 15:55 »

Цитировать
Короче сделал так:
я дико извиняюсь-а можно поподробнее, а то ничего не понял. Я пытался вставить в строку QChar(0x0160) - это та самая Š. Не срабатывает
Записан

QT4, Qt5, Qt6 Debian, ArchLinux
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июнь 05, 2015, 16:09 »

Цитировать
Короче сделал так:
я дико извиняюсь-а можно поподробнее, а то ничего не понял. Я пытался вставить в строку QChar(0x0160) - это та самая Š. Не срабатывает
Вы засекли то что печатается неверно. Теперь пишете что-то типа
Код
C++ (Qt)
QString str("Bezier");  // слово в котором у меня были проблемы с первой "е"
qDebug() << str;       // убедимся это отображается как надо
printf("str[1] = 0x%x\n", (int) str[1].unicode());   // нужный код
Для поиска "неверной" буквы - процедура та же
Записан
sociopath
Гость
« Ответ #13 : Июнь 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");
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #14 : Июнь 07, 2015, 03:26 »

ну вот у меня "источник"  = текст из нативных ресурсов, поди угадай какая она там.
можно попробовать угадать через +[NSString stringWithContentsOfFile:usedEncoding:error:], но грузить надо из файла
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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