Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QString->UCS2


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

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

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

получаю строку : \320\277\321\200\320\270\320\262\320\265\321\202 test
Как её преобразовать в UCS2 не соображу

Автор: math64 18.5.2012, 17:10
Насколько я понял, тебе нужно это:
Код

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

Автор: borisbn 18.5.2012, 17:19
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.html#operator-5b-5d-2
http://qt-project.org/doc/qt-4.8/qchar.html#unicode-2

Автор: Shadowlord 18.5.2012, 18:06
Проверил оба варианта, как и сказал 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"

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

Автор: math64 18.5.2012, 22:24
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() может не заканчиваться нулём, а иногда нуль - законный символ в середине строки.
Лучше воспользоваться длиной строки, для определения её конца.

Автор: Shadowlord 19.5.2012, 06:57
все варианты , результат у всех один и тот же
Код

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 ричный

Автор: _GRIN_ 19.5.2012, 09:20
Как то так:
Код

#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

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

Автор: Shadowlord 19.5.2012, 12:23
math64, borisbn,bsa,_GRIN_, большое Спасибо за помощь 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)