Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Русская кодировка в Qt
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
++Norton++
Есть такой вот такие куски кода:

if(!test.open(QIODevice::Append | QIODevice::Text)) { ui->statusLabel->setText("Ругаюсь: Не могу открыть файл"); return 1; }


и

QTextStream out1(&test);
QTextStream out2(&counter);

out1 << "This is test: Тест";
out2 << "final";


В первом случае в statusLabel (label) выводятся нечитаемые символы неизвестной кодировки.
Во втором случае в файл записывается только "This is test: ". Слово "Тест" в него вообще не записывается.
Вопрос в том, можно ли как-нибудь это все поправить?
SABROG
Вопрос в том в какой кодировке у тебя исходники. Отсюда и плясать.
AD
В функции main() указать:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));    ///< Для строковых констант
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));        ///< Для функций перевода tr()

В своем коде сделать так:
if(!test.open(QIODevice::Append | QIODevice::Text)) { ui->statusLabel->setText(tr("Ругаюсь: Не могу открыть файл")); return 1; }

QTextStream out1(&test);
QTextStream out2(&counter);

out1 << "This is test: " << tr("Тест");
out2 << "final";

Скорее всего, поможет! ;)
Litkevich Yuriy
Цитата(AD @ 12.2.2009, 18:14) *
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); ///< Для строковых констант
Это не для констант, а для внутреннего преобразования QString/QByteArray
и для строк лучше так не задовать кодировку

можно так:
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());  // Для внутренних преобразований Qt
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()


для вывода в консоль можно отдельно задать кодировку:
QTextCodec *concodec = QTextCodec::codecForName(CON_ENCOD);        // Кодек для консоли
QTextStream out(stdout);
out.setCodec(concodec);
out << tr("Мой текст");

CON_ENCOD - требуемый кодек
++Norton++
Спасибо!
Только еще один вопрос. Ругается на строку:
out1 << tr("№") << i << tr(ui->phormulEdit->text()) << i << tr(ui->taskEdit->text());


Пишет:
/home/n0rt0n/doc/programming/TestCreator-1.0.0/TestCreator/widget.cpp:66: error: no matching function for call to 'Widget::tr(QString)'


Что не так?
Litkevich Yuriy
Цитата(++Norton++ @ 12.2.2009, 19:22) *
Widget::tr(QString)'
Такого типа в Qt нет
++Norton++
А как же тогда можно преобразовать текст с помощью tr() из LineEdit'a (phormulEdit)?
Litkevich Yuriy
от кого унаследован Widget?
приведи объявление этого класса
++Norton++
Вот объявление (в widget.cpp):
Widget::Widget(QWidget *parent)
    : QWidget(parent), ui(new Ui::WidgetClass)
{

        ui->setupUi(this);
        connect(ui->createButton, SIGNAL(clicked()), this, SLOT(prepare()));
        connect(ui->nextTask, SIGNAL(clicked()), this, SLOT(generate()));
        connect(ui->saveButton, SIGNAL(clicked()), this, SLOT(finalize()));
}


Вот в widget.h:
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    int checking(int a);

public slots:
    int generate();
    int prepare();
    int finalize();

private:
    Ui::WidgetClass *ui;
};
Litkevich Yuriy
Цитата(++Norton++ @ 12.2.2009, 19:44) *
Вот объявление (в widget.cpp):
это не объявление, а реализация

Цитата(++Norton++ @ 12.2.2009, 19:22) *
tr(ui->phormulEdit->text()) << i << tr(ui->taskEdit->text());
к стати говоря, в функцию tr оборачивай только строковые константы, как здесь:
Цитата(++Norton++ @ 12.2.2009, 19:22) *
tr("№")
AD
Цитата(Litkevich Yuriy @ 12.2.2009, 15:43) *
можно так:
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());  // Для внутренних преобразований Qt
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()

Блин вот как раз для tr() следует задать кодек с Windows-1251. Проверил на своем приложении и у меня как раз на QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")) выдалась "абра-казябра". Так что для tr() если что, употребляй как раз
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"))
Litkevich Yuriy
Цитата(AD @ 12.2.2009, 20:12) *
Windows-1251
кодировку выбираешь такую в какой код пишешь (в текстовом редакторе)
а вот для внутренностей, если с БД не работаешь, то можно вообще не указывать.
Константин
если исходники в ютф-8, то вместо tr() пользовать trUtf8().
а лучше вообще не писать нелатиницей в исходниках - учитесь хорошим манерам.
Litkevich Yuriy
Цитата(Константин @ 12.2.2009, 20:46) *
а лучше вообще не писать нелатиницей в исходниках - учитесь хорошим манерам.
а я так не считаю. Хорошая манера писать на своем родном языке. кому надо тот пусть колбасится с переводом.
AD
Цитата(Litkevich Yuriy @ 12.2.2009, 17:19) *
кодировку выбираешь такую в какой код пишешь (в текстовом редакторе)
а вот для внутренностей, если с БД не работаешь, то можно вообще не указывать.

Так и надо было сразу сказать: что следует выбрать ту кодировку, в которой работает редактор, в котором написан код. Я этого даже и не знал!
Константин
Цитата(Litkevich Yuriy @ 12.2.2009, 17:50) *
кому надо тот пусть колбасится с переводом.

это ещё пол-беды, если исходники в utf-8 - кто знает язык, сможет и перевести. а если сорцы в ja_JP? я не стану устанавливать кучу локалей ради драного куска кода...и не я один.

Цитата(AD @ 12.2.2009, 17:54) *
Так и надо было сразу сказать: что следует выбрать ту кодировку, в которой работает редактор, в котором написан код. Я этого даже и не знал!


*выбрать ту кодировку, в которой сохранены исходники.
Litkevich Yuriy
Цитата(AD @ 12.2.2009, 20:54) *
Так и надо было сразу сказать: что следует выбрать ту кодировку, в которой работает редактор, в котором написан код. Я этого даже и не знал!
тогда с тебя статья в вики, хотя я тебе уже как-то по лету это объяснял. Раз уж ты это окончательно понял, то и описать сможешь получше ;)

[offtop]
Цитата(Константин @ 12.2.2009, 20:56) *
а если сорцы в ja_JP? я не стану устанавливать кучу локалей ради драного куска кода...и не я один.
ну если думать о распространении ПО для других языковых регионов, то лучше чем UTF-8 врядли что-то придумаешь.

А вот занимаясь переводом документации обнаружено у тролей в исходниках неизкоренимая привычка все к латин1 приводить.
так что это в какой-то мере тест на наличие немногоязычных багов (даж поэтому поводу с трольтеховцами пообщались)

П.С. яб тоже не стал устанавливать лишнюю локаль, мне виндовоза с его двумя кодировками в одной ОСи хватает :)
[/offtop]
Константин
Цитата(Litkevich Yuriy @ 12.2.2009, 18:33) *
<snip>(даж поэтому поводу с трольтеховцами пообщались)

как ты Дениса во множественном числе :)

к слову, после давнешней любви с кудевелопом я тоже храню сорцы исключительно в 8859-1 или utf-8 (стараюсь следить чтобы в пределах одного проекта не перемешивались). как результат - проблем с кракозябрами не наблюдал уже довольно давно...

[офф]
как этом чёртов isp заставить опознавать меня и через 10 минут, и через 10 суток? примерно раз-два в час авторизацию перезапрашивает (
[/офф]
Litkevich Yuriy
Цитата(Константин @ 12.2.2009, 22:25) *
как этом чёртов isp заставить опознавать меня и через 10 минут, и через 10 суток? примерно раз-два в час авторизацию перезапрашивает (
пиши в форум "обратная связь", может это из-за того что ты скрыто входишь

П.С. я пост на части поделить не могу, чтобы перенести :(

Цитата(Константин @ 12.2.2009, 22:25) *
как ты Дениса во множественном числе
ну это типа я преувеличиваю значимость :blush2:
molchanoviv
Цитата(Константин @ 12.2.2009, 17:56) *
Цитата(Litkevich Yuriy @ 12.2.2009, 17:50) *
кому надо тот пусть колбасится с переводом.

это ещё пол-беды, если исходники в utf-8 - кто знает язык, сможет и перевести. а если сорцы в ja_JP? я не стану устанавливать кучу локалей ради драного куска кода...и не я один.

Цитата(AD @ 12.2.2009, 17:54) *
Так и надо было сразу сказать: что следует выбрать ту кодировку, в которой работает редактор, в котором написан код. Я этого даже и не знал!


*выбрать ту кодировку, в которой сохранены исходники.


Плюсую. Анатолий начал писать FreeDevStudio++ используюя русский язык в строковых переменных, и впоследствии мы обрели некоторые проблемы с реализацией перевода на другие языки. Поэтому я считаю что их необходимо писать на английском языке, а вот коментарии только на родном, и тут уже кому надо, тот разберется.
++Norton++
Дело в том, что как раз надо записать в файл строку из ui->phormulEdit->text() (Здесь phormulEdit - LineEdit), а она там на русском языке :(. Получается что это невозможно?
SABROG
Цитата(++Norton++ @ 13.2.2009, 0:59) *
Дело в том, что как раз надо записать в файл строку из ui->phormulEdit->text() (Здесь phormulEdit - LineEdit), а она там на русском языке :(. Получается что это невозможно?

Ты уж определись откуда ты писать хочешь. В lineEdit одна кодировка текста (unicode/Utf8), в исходниках другая (cp1251/utf8/cp866/koi8r и т.д.).
Litkevich Yuriy
Цитата(++Norton++ @ 13.2.2009, 3:59) *
Дело в том, что как раз надо записать в файл
см. пост №4 пример вывода в консоль, вместо консоли (stdout) укажи файл, кодек устанавливай такой какой нужен в целевом файле
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.