Russian Qt Forum

Qt => Общие вопросы => Тема начата: UVV от Март 30, 2009, 06:24



Название: to utf8 string
Отправлено: UVV от Март 30, 2009, 06:24
Есть такое преобразование:
Код:
string s;
QString t = QString::fromUtf8(s.c_str());

А как из t обратно в s?


Название: Re: to utf8 string
Отправлено: Rcus от Март 30, 2009, 06:33
Код:
inline std::string QString::toStdString() const
{ const QByteArray asc = toAscii(); return std::string(asc.constData(), asc.length()); }

чтобы ::toAscii преобразовывал в utf8 нужно поставить codecForCStrings. Или ввести новую функцию с toUtf8 преобразованием вместо.


Название: Re: to utf8 string
Отправлено: UVV от Март 30, 2009, 07:05
Код:
inline std::string QString::toStdString() const
{ const QByteArray asc = toAscii(); return std::string(asc.constData(), asc.length()); }

чтобы ::toAscii преобразовывал в utf8 нужно поставить codecForCStrings. Или ввести новую функцию с toUtf8 преобразованием вместо.

Спасибо, вот это помогло:
Код:
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);


Название: Re: to utf8 string
Отправлено: crackedmind от Март 30, 2009, 07:10
Ну можно еще воспользоваться QTextEncoder/QTextDecoder как вариант. Вместо глобальной установки кодека.


Название: Re: to utf8 string
Отправлено: UVV от Март 30, 2009, 07:17
Зачем? Разве нужно ещё что-то, кроме utf-8? ;)


Название: Re: to utf8 string
Отправлено: shadone от Апрель 01, 2009, 15:08
Есть такое преобразование:
Код:
string s;
QString t = QString::fromUtf8(s.c_str());

А как из t обратно в s?
как это string (это std::string ?) содержит utf8 строку?? std::string хранит строки без преобразования, т.е. в текущей локали - поэтому для преобразования QString<->std::string надо использовать toLocal8Bit/fromLocal8Bit.


Название: Re: to utf8 string
Отправлено: Alex03 от Апрель 02, 2009, 08:08
как это string (это std::string ?) содержит utf8 строку?? std::string хранит строки без преобразования, т.е. в текущей локали - поэтому для преобразования QString<->std::string надо использовать toLocal8Bit/fromLocal8Bit.
std::string хранит строку такую - какую в него положили, текущая локаль тут не при чём.
UVV По вопросу топика:
Код:
s = t.utf8().constData();


Название: Re: to utf8 string
Отправлено: shadone от Апрель 02, 2009, 11:27
как это string (это std::string ?) содержит utf8 строку?? std::string хранит строки без преобразования, т.е. в текущей локали - поэтому для преобразования QString<->std::string надо использовать toLocal8Bit/fromLocal8Bit.
std::string хранит строку такую - какую в него положили, текущая локаль тут не при чём.
согласен. однако std::string не является unicode-aware контейнером и хранить там utf8 строки - странно. Плюс по-дефолту классы stl работают в текущей локали (например такой код: std::string str; std::cin >> str; // str - строка в текущей локали.) Почему я об этом говорю - т.к. нет гарантий что std::string содержит строку именно в utf8 и в общем случае нужно использовать именно toLocal8Bit/fromLocal8Bit


Название: Re: to utf8 string
Отправлено: pastor от Апрель 02, 2009, 11:38
однако std::string не является unicode-aware контейнером и хранить там utf8 строки - странно.

+1

Для хранение unicode-строк есть std::wstring


Название: Re: to utf8 string
Отправлено: Rcus от Апрель 02, 2009, 12:00
По мне так вполне нормальное решение когда не нужно выводить строки пользователю. Например в протоколе ed2k строковые теги передаются в utf8, было бы странно хранить их в utf16/utf32 только затем, чтобы преобразовать обратно в utf8 для передачи.