Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT] Компилирование исходников, содержащих кириллицу 
V
    Опции темы
Aleksiy
Дата 23.1.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



Ни как не могу понять почему не отображается текст в кириллице

Код

#include <QApplication>
#include <QMainWindow>
#include <QTextCodec>

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

    QTextCodec *codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(codec);

    QMainWindow *wm = new QMainWindow(0,Qt::Window);
    wm->setWindowTitle(QMainWindow::tr("Привет"));
    wm->resize(400,300);
    wm->show();
    return app.exec();
}

PM MAIL   Вверх
archimed7592
Дата 23.1.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



А так?
Код

QTextCodec *codec = QTextCodec::codecForName("Windows-1251");



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Aleksiy
Дата 23.1.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 23.1.2008

Репутация: нет
Всего: нет



И так тоже не работает 
PM MAIL   Вверх
Mazzi
Дата 23.1.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: нет
Всего: 21



Код

QTextCodec *codec = QTextCodec::codecForName("CP-1251");


так тоже работает.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
bsa
Дата 23.1.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Aleksiy, в какой кодировке у тебя исходный файл? Без кодека пробовал? И какая операционка?

Это сообщение отредактировал(а) bsa - 23.1.2008, 12:02
PM   Вверх
Mazzi
Дата 23.1.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: нет
Всего: 21



Цитата(Aleksiy @ 23.1.2008,  11:52)
И так тоже не работает

Для Aleksiy. У тебя файл не в той что нужно кодировке.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
SABROG
Дата 23.1.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Mazzi @ 23.1.2008,  12:03)
Цитата(Aleksiy @ 23.1.2008,  11:52)
И так тоже не работает

Для Aleksiy. У тебя файл не в той что нужно кодировке.

Дело не в файле, а именно в строке. Проблема заключается в том, что если исходник сохранить скажем в Utf-8, то gcc такой файл не воспримет, т.ч. все исходники должны быть в обычной досовской кодировке (байты 0-255).

Далее, в зависимости от винды и программы, при редактировании исходников русский текст может сохраняться как cp1251 или utf-8, при этом весь остальной текст, обычно английский, будет выглядеть во всех кодировках одинаково. Таким образом, чтобы выбрать кодек, надо четко знать в какой кодировке писался русский текст в момент редактирования исходников.

Но я не думаю, что это правильное решение, поэтому лично сам пишу сначала все по-английски, а потом через .ts файлы перевожу в русский текст, а в зависимости от локали выбирается перевод:

Код

QString app_locale = QLocale::system().name().left(2);

    QTranslator app_translator, qt_translator;
    
        if( app_translator.load(QLatin1String(":/Translates/language/app_") + app_locale))
        {
        app.installTranslator(&app_translator);
        }
            if( qt_translator.load(QLatin1String(":/Translates/language/qt_") + app_locale)) 
            {
            app.installTranslator(&qt_translator);
            }
            else
            {
            qWarning("Cannot load translation files for application");
            }


А еще глянь в сторону: QString::fromLocal8Bit(const char *str)

Это сообщение отредактировал(а) SABROG - 23.1.2008, 12:56


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 23.1.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(SABROG @ 23.1.2008,  12:48)
Дело не в файле, а именно в строке. Проблема заключается в том, что если исходник сохранить скажем в Utf-8, то gcc такой файл не воспримет, т.ч. все исходники должны быть в обычной досовской кодировке (байты 0-255).

Да что ты? По жизни сохраняю все, компилируемое в gcc, в utf8. Ты не путай utf8 и utf16.  smile 
PM   Вверх
SABROG
Дата 23.1.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(bsa @ 23.1.2008,  12:55)
Цитата(SABROG @ 23.1.2008,  12:48)
Дело не в файле, а именно в строке. Проблема заключается в том, что если исходник сохранить скажем в Utf-8, то gcc такой файл не воспримет, т.ч. все исходники должны быть в обычной досовской кодировке (байты 0-255).

Да что ты? По жизни сохраняю все, компилируемое в gcc, в utf8. Ты не путай utf8 и utf16.  smile

Я говорю про gcc, который именно в MinGW. Специально для тебя взял исходник действующей программы и в emeditor'e сохранил его из кодировки windows-1251 в кодировку utf-8 (без добавления сигнатуры, перевод кареток виндосовский CR+LF), вот что из этого вышло:

Код

src\Price_class.cpp:1: error: stray '\239' in program
src\Price_class.cpp:1: error: stray '\187' in program
src\Price_class.cpp:1: error: stray '\191' in program
src\Price_class.cpp:1: error: invalid token
src\Price_class.cpp:3: error: expected constructor, destructor, or type conversion before string constant
src\Price_class.cpp:3: error: expected `,' or `;' before string constant
src\Price_class.cpp:8: error: expected constructor, destructor, or type conversion before '::' token



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
archimed7592
Дата 23.1.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



Цитата(bsa @  23.1.2008,  12:55 Найти цитируемый пост)
Да что ты? По жизни сохраняю все, компилируемое в gcc, в utf8.

Ладно, отложим вопрос об умении gcc воспринимать utf-8 исходники. Я немного не понимаю другого:
Код

std::string s = "Привет, меня зовут Вася.";
char c1 = s[3]; // чему будет равно c1?
char c2 = 'Г';
int i2 = c2; // чему будет равно i2?

Тебя не напрягают эти ньюансы? Ещё теоретически есть "маленькая" проблема с выводом таких строк в поток(но, ничего конкретно сказать не могу).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SABROG
Дата 23.1.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(archimed7592 @ 23.1.2008,  13:05)
Цитата(bsa @  23.1.2008,  12:55 Найти цитируемый пост)
Да что ты? По жизни сохраняю все, компилируемое в gcc, в utf8.

Ладно, отложим вопрос об умении gcc воспринимать utf-8 исходники. Я немного не понимаю другого:
Код

std::string s = "Привет, меня зовут Вася.";
char c1 = s[3]; // чему будет равно c1?
char c2 = 'Г';
int i2 = c2; // чему будет равно i2?

Тебя не напрягают эти ньюансы? Ещё теоретически есть "маленькая" проблема с выводом таких строк в поток(но, ничего конкретно сказать не могу).

При работе с регулярными выражениями из-за кодировки сразу начнутся косяки.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
bsa
Дата 23.1.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Код
#include <iostream>
int main()
{
    std::cout << "Привет мир!" << std::endl;
    return 0;
}
Дамп файла:
Код
00000000 23 69 6E 63 │ 6C 75 64 65 │ 20 3C 69 6F │ 73 74 72 65  #include <iostre
00000010 61 6D 3E 0A │ 69 6E 74 20 │ 6D 61 69 6E │ 28 29 0A 7B  am>.int main().{
00000020 0A 09 73 74 │ 64 3A 3A 63 │ 6F 75 74 20 │ 3C 3C 20 22  ..std::cout << "
00000030 D0 9F D1 80 │ D0 B8 D0 B2 │ D0 B5 D1 82 │ 20 D0 BC D0  Ð.Ñ.ивеÑ. мÐ
00000040 B8 D1 80 21 │ 22 20 3C 3C │ 20 73 74 64 │ 3A 3A 65 6E  ¸Ñ.!" << std::en
00000050 64 6C 3B 0A │ 09 72 65 74 │ 75 72 6E 20 │ 30 3B 0A 7D  dl;..return 0;.}
00000060 0A                                                     .
Компилируется и работает. gcc-4.1.2
PM   Вверх
archimed7592
Дата 23.1.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



bsa, я ещё раз спрошу: тебя не напрягает то, что символ начинает представлять из себя неопределённое количество байт? (IIRC, от 1 до 6)


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 23.1.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



archimed7592, что такое utf8 и чем грозит str[3] я прекрасно знаю. Поэтому никогда str[3] не делаю (если очень понадобится, то переведу в utf32). Да и на char c = 'Г'; компилятор выдаст warning.

Это сообщение отредактировал(а) bsa - 23.1.2008, 13:33
PM   Вверх
archimed7592
Дата 23.1.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 11
Всего: 93



bsa, если знаешь, то в чём тогда сакраментальный смысл использования utf8? Намного выгоднее использовать utf16 или, для особо параноиков - utf32, а, когда необходимо отдавать текстовую информацию "наружу"(файл, консоль, сервер и т.п.), перекодировать в utf-8. К примеру, фреймворки Qt и .NET оба работают именно так, а их проектировали вовсе не дураки. Не даром в Стандарт собираются добавить поддержку utf16/32, но не собираются добавлять поддержки utf8.

Тут играет роль не только аспект производительности, но обыкновенная логика: зачем делать лишние действия, которых можно просто не делать(я про действия, которые программист должен делать явно и руками).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1060 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.