Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QString->UCS2 
V
    Опции темы
Shadowlord
Дата 18.5.2012, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



Задача стоит получить из строки последовательность в ucs2
тоесть к примеру:
входная строка=Привет
выходная строка=041f04400438043204350442

Записав данные просто в Qstring
Код

QString test="привет test";

получаю строку : \320\277\321\200\320\270\320\262\320\265\321\202 test
Как её преобразовать в UCS2 не соображу
PM MAIL   Вверх
math64
Дата 18.5.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Насколько я понял, тебе нужно это:
Код

QString output = "";
for(int i=0; i < input.length(); i++) {
  output += QString("%1").arg((uint)input[i], 4, 16, '0');
}

PM   Вверх
borisbn
Дата 18.5.2012, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



math64, если input - это QString, то operator[] возвращает QChar, и, по-моему, его нельзя так преобразовывать
Цитата(math64 @  18.5.2012,  17:10 Найти цитируемый пост)
(uint)input[i]

правильнее сделать так
Код

QString output = "";
for(int i=0; i < input.length(); i++) {
  output += QString("%1").arg(input[i].unicode(), 4, 16, '0');
}

http://qt-project.org/doc/qt-4.8/qstring.h...perator-5b-5d-2
http://qt-project.org/doc/qt-4.8/qchar.html#unicode-2


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Shadowlord
Дата 18.5.2012, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



Проверил оба варианта, как и сказал borisbn, вариант  math64 не работает из-за типов. Но и второй вариант не дал нужного результата
взям 
Код

QStrin input="п" 
QString output = "";
for(int i=0; i < input.length(); i++) {
  output += QString("%1").arg(input[i].unicode(), 4, 16, '0');
}
 
Я получил из строки "п" в памяти дебагер говорит это "\320\277" строку "208.00000000000000000000000000000000000191.00000000000000000000000000000000000 " .
А нужно получить"041F"

Это сообщение отредактировал(а) Shadowlord - 18.5.2012, 18:10
PM MAIL   Вверх
bsa
Дата 18.5.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



попробуй использовать метод QString::utf16:
Код
for(const ushort *p = input.utf16(); *p; ++p)
   output += QString("%1").arg(*p, 4, 16, '0');

PM   Вверх
math64
Дата 18.5.2012, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



1. У arg() первый аргумент должен быть ushort  или uint, у тебя почему-то получается double или float.
2. В строке "п" - один символ, у тебя получается два. Видимо, кодек для CStrings не тот.
Если исходники в utf8
Код

QString input = QString::fromUTF8("п");

или
Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QString input = "п";

Мой вариант не работает, потому что operator[](int) возвращает QCharRef.
Если же const QString input; то operator[](int) const возвращает QChar. Но QChar тоже нужно превращать в ushort посредством unicode();
Вместо input[i] можно использовать input.at(i); 
Строка, возвращаемая QString::unicode() может не заканчиваться нулём, а иногда нуль - законный символ в середине строки.
Лучше воспользоваться длиной строки, для определения её конца.


Это сообщение отредактировал(а) math64 - 18.5.2012, 22:45
PM   Вверх
Shadowlord
Дата 19.5.2012, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



все варианты , результат у всех один и тот же
Код

QString input = QString::fromUTF8("п");
QString output = "";
for(int i=0; i < input.length(); i++) {
  output += QString("%1").arg(input[i].unicode(), 4, 16, '0');
}

output = "";
for(int i=0; i < input.length(); i++) {
  output += QString("%1").arg((uint)input[i].unicode(), 4, 16, '0');
}

output = "";
for(int i=0; i < input.length(); i++) {
  output += QString("%1").arg((uint)input.at(i).unicode(), 4, 16, '0');
}

output = "";
for(const ushort *p = input.utf16(); *p; ++p)
   output += QString("%1").arg(*p, 4, 16, '0');


После смены кодека мвходная строка в памяти уже хранится как  \2077 что воспринимается как один символ.
врезультате получается строка "1087.00000000000000000000000000000000000"
Ух извеняюсь не ту сстроку брал для "П"
"1055.00000000000000000000000000000000000" собственно десятичный вид 041f того что нужно но вот нужно именно 16 ричный

Это сообщение отредактировал(а) Shadowlord - 19.5.2012, 11:22
PM MAIL   Вверх
_GRIN_
Дата 19.5.2012, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Как то так:
Код

#include <QString>
#include <QDebug>

QString strAsUsc2Code(const QString& input)
{
    QString res;
    for(const ushort* p = input.utf16(); *p; p++)
    {
        res.append(QString::number(*p,16));
    }
    return res;
}

int main()
{
    const QString input = "Привет";
    qDebug() << input;
    qDebug() << strAsUsc2Code(input);
    return 0;
}


Лог выполнения (исходная строка набрана в кодировке Utf8):
Код

Starting /home/grin/1_work/research/qt/tst_usc2_encoding/tst_usc2_encoding...
"Привет" 
"d09fd180d0b8d0b2d0b5d182" 
/home/grin/1_work/research/qt/tst_usc2_encoding/tst_usc2_encoding exited with code 0



--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Shadowlord
Дата 19.5.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



_GRIN_, по твоему варианту я тоже получил
"1055.00000000000000000000000000000000000"
а нужно в 16 системе 041f
Не пойму где я неправ
 
Закралось не хорошее подозрение, и я проверил в отдельном новом проекте, там проработало правильно. Вот только ушлти нули с лева, а мне их нужно оставить.
Буду разираться что у меня в проекте не так.
Попробовал не допиывать в уже существующию строку значение, а писать в пустую, перевод пошел коректный, остался вопрос как сохранить нули
Решил проблему с нулями , правда не совсем элеганто, просто проверяю на сколько строка менбше 4 и дописываю сколько не хватает нулей в начало


Это сообщение отредактировал(а) Shadowlord - 19.5.2012, 12:23
PM MAIL   Вверх
Shadowlord
Дата 19.5.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 28.11.2006

Репутация: нет
Всего: 5



math64, borisbn,bsa,_GRIN_, большое Спасибо за помощь 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.