Версия для печати темы
Форум на 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)
как ты Дениса во множественном числе
ну это типа я преувеличиваю значимость
Автор: 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)