Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Русская кодировка в Qt

Автор: ++Norton++ 12.2.2009, 14:58

Есть такой вот такие куски кода:

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 12.2.2009, 15:13

Вопрос в том в какой кодировке у тебя исходники. Отсюда и плясать.

Автор: AD 12.2.2009, 15:14

В функции 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 12.2.2009, 15:43

Цитата(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++ 12.2.2009, 16:22

Спасибо!
Только еще один вопрос. Ругается на строку:

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 12.2.2009, 16:23

Цитата(++Norton++ @ 12.2.2009, 19:22) *
Widget::tr(QString)'
Такого типа в Qt нет

Автор: ++Norton++ 12.2.2009, 16:29

А как же тогда можно преобразовать текст с помощью tr() из LineEdit'a (phormulEdit)?

Автор: Litkevich Yuriy 12.2.2009, 16:37

от кого унаследован Widget?
приведи объявление этого класса

Автор: ++Norton++ 12.2.2009, 16:44

Вот объявление (в 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 12.2.2009, 16:51

Цитата(++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 12.2.2009, 17:12

Цитата(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 12.2.2009, 17:19

Цитата(AD @ 12.2.2009, 20:12) *
Windows-1251
кодировку выбираешь такую в какой код пишешь (в текстовом редакторе)
а вот для внутренностей, если с БД не работаешь, то можно вообще не указывать.

Автор: Константин 12.2.2009, 17:46

если исходники в ютф-8, то вместо tr() пользовать trUtf8().
а лучше вообще не писать нелатиницей в исходниках - учитесь хорошим манерам.

Автор: Litkevich Yuriy 12.2.2009, 17:50

Цитата(Константин @ 12.2.2009, 20:46) *
а лучше вообще не писать нелатиницей в исходниках - учитесь хорошим манерам.
а я так не считаю. Хорошая манера писать на своем родном языке. кому надо тот пусть колбасится с переводом.

Автор: AD 12.2.2009, 17:54

Цитата(Litkevich Yuriy @ 12.2.2009, 17:19) *
кодировку выбираешь такую в какой код пишешь (в текстовом редакторе)
а вот для внутренностей, если с БД не работаешь, то можно вообще не указывать.

Так и надо было сразу сказать: что следует выбрать ту кодировку, в которой работает редактор, в котором написан код. Я этого даже и не знал!

Автор: Константин 12.2.2009, 17:56

Цитата(Litkevich Yuriy @ 12.2.2009, 17:50) *
кому надо тот пусть колбасится с переводом.

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

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


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

Автор: Litkevich Yuriy 12.2.2009, 18:33

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

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

А вот занимаясь переводом документации обнаружено у тролей в исходниках неизкоренимая привычка все к латин1 приводить.
так что это в какой-то мере тест на наличие немногоязычных багов (даж поэтому поводу с http://www.forum.crossplatform.ru/index.php?showtopic=284&view=findpost&p=2801)

П.С. яб тоже не стал устанавливать лишнюю локаль, мне виндовоза с его двумя кодировками в одной ОСи хватает :)
[/offtop]

Автор: Константин 12.2.2009, 19:25

Цитата(Litkevich Yuriy @ 12.2.2009, 18:33) *
<snip>(даж поэтому поводу с трольтеховцами пообщались)

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

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

[офф]
как этом чёртов isp заставить опознавать меня и через 10 минут, и через 10 суток? примерно раз-два в час авторизацию перезапрашивает (
[/офф]

Автор: Litkevich Yuriy 12.2.2009, 20:31

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

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

Цитата(Константин @ 12.2.2009, 22:25) *
как ты Дениса во множественном числе
ну это типа я преувеличиваю значимость :blush2:

Автор: molchanoviv 12.2.2009, 21:13

Цитата(Константин @ 12.2.2009, 17:56) *
Цитата(Litkevich Yuriy @ 12.2.2009, 17:50) *
кому надо тот пусть колбасится с переводом.

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

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


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


Плюсую. Анатолий начал писать FreeDevStudio++ используюя русский язык в строковых переменных, и впоследствии мы обрели некоторые проблемы с реализацией перевода на другие языки. Поэтому я считаю что их необходимо писать на английском языке, а вот коментарии только на родном, и тут уже кому надо, тот разберется.

Автор: ++Norton++ 13.2.2009, 0:59

Дело в том, что как раз надо записать в файл строку из ui->phormulEdit->text() (Здесь phormulEdit - LineEdit), а она там на русском языке :(. Получается что это невозможно?

Автор: SABROG 13.2.2009, 1:12

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

Ты уж определись откуда ты писать хочешь. В lineEdit одна кодировка текста (unicode/Utf8), в исходниках другая (cp1251/utf8/cp866/koi8r и т.д.).

Автор: Litkevich Yuriy 13.2.2009, 3:01

Цитата(++Norton++ @ 13.2.2009, 3:59) *
Дело в том, что как раз надо записать в файл
см. пост http://www.forum.crossplatform.ru/index.php?showtopic=2155&view=findpost&p=14476 пример вывода в консоль, вместо консоли (stdout) укажи файл, кодек устанавливай такой какой нужен в целевом файле

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)