Russian Qt Forum
Ноябрь 24, 2024, 00:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: to utf8 string  (Прочитано 8135 раз)
UVV
Гость
« : Март 30, 2009, 06:24 »

Есть такое преобразование:
Код:
string s;
QString t = QString::fromUtf8(s.c_str());

А как из t обратно в s?
Записан
Rcus
Гость
« Ответ #1 : Март 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 преобразованием вместо.
Записан
UVV
Гость
« Ответ #2 : Март 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);
Записан
crackedmind
Гость
« Ответ #3 : Март 30, 2009, 07:10 »

Ну можно еще воспользоваться QTextEncoder/QTextDecoder как вариант. Вместо глобальной установки кодека.
Записан
UVV
Гость
« Ответ #4 : Март 30, 2009, 07:17 »

Зачем? Разве нужно ещё что-то, кроме utf-8? Подмигивающий
Записан
shadone
Гость
« Ответ #5 : Апрель 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.
Записан
Alex03
Гость
« Ответ #6 : Апрель 02, 2009, 08:08 »

как это string (это std::string ?) содержит utf8 строку?? std::string хранит строки без преобразования, т.е. в текущей локали - поэтому для преобразования QString<->std::string надо использовать toLocal8Bit/fromLocal8Bit.
std::string хранит строку такую - какую в него положили, текущая локаль тут не при чём.
UVV По вопросу топика:
Код:
s = t.utf8().constData();
Записан
shadone
Гость
« Ответ #7 : Апрель 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
« Последнее редактирование: Апрель 02, 2009, 11:37 от ddenis » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Апрель 02, 2009, 11:38 »

однако std::string не является unicode-aware контейнером и хранить там utf8 строки - странно.

+1

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Rcus
Гость
« Ответ #9 : Апрель 02, 2009, 12:00 »

По мне так вполне нормальное решение когда не нужно выводить строки пользователю. Например в протоколе ed2k строковые теги передаются в utf8, было бы странно хранить их в utf16/utf32 только затем, чтобы преобразовать обратно в utf8 для передачи.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.