Russian Qt Forum

Qt => Вопросы новичков => Тема начата: xTr1m от Март 01, 2012, 08:12



Название: И снова QString в std::string (русский текст)
Отправлено: xTr1m от Март 01, 2012, 08:12
Здравствуйте, вот есть у меня поле для ввода текста. Ввожу я туда русский текст и этот текст мне нужно перевести в std::string (так уж получилось). Что я пробовал:
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QString prdId = ui.m_prdIdEdit->text();

// std::string str = prdId.toAscii().data();
// std::string str = prdId.toStdString();
// std::string str = tr(prdId.toStdString().c_str()).toStdString();
// std::string str = tr(prdId.toAscii().data()).toStdString();
всюду знаки вопроса. Буду благодарен за помощь.


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 08:15
Код:
std::locale loc("russian_russia.1251");
std::locale::global(loc);



Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 08:16
QByteArray QTextCodec::fromUnicode ( const QString & str ) const


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 08:18
BRE, а не слишком ли быстро вы мчитесь? :)

Ему перевести в std::string надо (а у QString даже ф-ция есть для этого), а вы ему QByteArray предлагаете ;)

update: ТС, тебе нужен именно .toStdString();


Название: Re: И снова QString в std::string (русский текст)
Отправлено: xTr1m от Март 01, 2012, 08:24
Цитировать
std::locale loc("russian_russia.1251");
std::locale::global(loc);
к сожалению, не помогло.

Верес, так в том то и дело, что она возвращает знаки вопроса.

P.S. вообще как дико получается, что такая простая задача вызвала столько проблем =)


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 08:24
BRE, а не слишком ли быстро вы мчитесь? :)
Нет

Ему перевести в std::string надо (а у QString даже ф-ция есть для этого), а вы ему QByteArray предлагаете ;)
Да

update: ТС, тебе нужен именно .toStdString();
А в какой кодировке будет эта строка?


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 08:42
P.S. вообще как дико получается, что такая простая задача вызвала столько проблем =)
Нет никаких проблем.
В Qt все строки хранятся в юникоде, если тебе нужна другая кодировка воспользуйся QTextCodec.
И постарайся не использовать глобальные установки кодировок (QTextCode::setCodecFor...), в дальнейшем будет меньше проблем.


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 08:50
BRE не стоит тут холивар начинать.

Если он будет всегда использовать глобальные установки кодировок - то чики пуки.

Если он никогда не будет использовать глобальные установки кодировок - то чики пуки.

Смешивать = плохо.


Кодировка у нашего автора стоит windows-1251. Ему нужно же перевести в std, который о юникоде не слышал ;)

ТС(xTr1m)  - собери минимально компилируемый пример и выкинь сюда. Проще будет.


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 08:57
2Bepec У нас с тобой разное представление о "чики пуку".


Название: Re: И снова QString в std::string (русский текст)
Отправлено: xTr1m от Март 01, 2012, 09:03
хм. сделал простой пример вот так.
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

QString qStr = tr("Лолилол");
std::string stdStr = qStr.toStdString();
stdStr содержит знаки вопроса.

сделал вот так
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

QString qStr = ("Лолилол");
std::string stdStr = qStr.toStdString();
работает.

но в реальности у меня вот так
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

QString qStr = m_edit->text();
std::string stdStr = qStr.toStdString();
и так не работает


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 09:25
BRE - я ж написал, не поднимай холивар.

Русский в исходниках это плохо! Все на UTF-8! Скажем нет системным локалям! Скажем нет QTextCodec! Нам советуют свыше!!!


ТС - а откуда у тебя данные берутся? что за виджет "m_edit"?


Название: Re: И снова QString в std::string (русский текст)
Отправлено: xTr1m от Март 01, 2012, 09:31
QLineEdit


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 09:37
2ТС Ох, добавь в main:
Код
C++ (Qt)
QTextCodec::setCodecForCStrings( QTextCodec::codecForName("Windows-1251") );
 
и у тебя заработает toStdString.

Но это плохой подход.


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 09:50
BRE - я ж написал, не поднимай холивар.
Есть одна мудрая мысль: "Не говорите мне что делать и я не скажу куда вам идти".


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 10:03
2 реплики подряд - признак плохого воспитания, не? :P


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 10:08
2 реплики подряд - признак плохого воспитания, не? :P
Не, это ответы на совершенно разные вопросы, почему они должны быть в одной реплике? Как ты себе это представляешь? Хочешь поговорить об этом?


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 10:15
2 поста подряд, так же как и цитата двухстраничного коммента - неуважение ко всем, кто читает.

Рабочий пример, даже без указывания кодеков (проверено на русской винде, иных не имею)
Код:
QString text = ui.lineEdit->text();
std::string j = text.toLocal8Bit ();



Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 10:37
2 поста подряд, так же как и цитата двухстраничного коммента - неуважение ко всем, кто читает.
Блин, даже не знаю что и делать теперь. Ты там как? Держись!

Рабочий пример, даже без указывания кодеков (проверено на русской винде, иных не имею)
А ты как проверял?


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 10:49
ёмоё. BRE на тропе войны ;) Весеннее обострение?

Проверял просто - запускал на машине под русской вендой :D


Название: Re: И снова QString в std::string (русский текст)
Отправлено: xTr1m от Март 01, 2012, 10:50
Господа =), спасибо. Сработал такой совет:
Код:
std::string j = text.toLocal8Bit ();
но вопрос такой, а чем мне грозит такое явное приведение?


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 11:26
ёмоё. BRE на тропе войны ;) Весеннее обострение?
Ты себе льстишь.


Название: Re: И снова QString в std::string (русский текст)
Отправлено: BRE от Март 01, 2012, 11:29
но вопрос такой, а чем мне грозит такое явное приведение?
Сейчас происходит перекодирование в 8битную строку с использованием кодека, устанавливаемого методом QTextCodec::setCodecForLocale. По умолчанию он установлен на кодировку твоей локали. Т.е. для платформы с кодировкой CP1251 строка из QLineEdit будет преобразовываться к ней, а для платфорсы с UTF-8 - соответственно в UTF-8.
Если это нужное поведение, то все нормально.


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 12:02
Если ты делаешь программу для русскоязычной windows, то всё у тебя хоккей.

Если же ты делаешь кроссплатформенную программу, тебе придётся вникнуть глубже. Ещё глубже. И под конец использовать совсем другие кодеки. (с этой частью знаком теоретически, ибо мазохизмом не страдаю)


Название: Re: И снова QString в std::string (русский текст)
Отправлено: xTr1m от Март 01, 2012, 13:59
В том то и дело, что для английской она в будущем тоже будет нужна


Название: Re: И снова QString в std::string (русский текст)
Отправлено: Bepec от Март 01, 2012, 14:07
Вот тут и назревает вопрос интересный. Будет ли разница на английской локализации винды, иль не будет :)

Ну в принципе, если тупо менять язык интерфейса, разницы нет :)

Update: При смене системной локали на суахили/енглиш/украйн/эсперанто русские буктовки отображаются заказячками, НО после приёма из lineEdit и процедурі обработки, получаются русские буковки.

PS помнится біл слух, что локаль устанавливаемая при установке и локаль, меняемая в системе разніе вещи, но... Єто слухи, с них спросу нєма.

PPS а счас украйн локаль стоит ;) Скептикам - менял именно локаль, а не язік ввода.