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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: кодировка utf-8->utf16LE  (Прочитано 4130 раз)
Kn1fe
Гость
« : Июль 24, 2016, 23:43 »

Желательно с примером кода, пытался сделать через iconv и qtextcodec но не сработало. Платформа ubuntu 12, gcc4.6
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Июль 25, 2016, 10:26 »

Код
C++ (Qt)
QTextCodec * codec_utf8 = QTextCodec::codecForName( "UTF-8" );
QTextCodec * codec_utf16le = QTextCodec::codecForName( "UTF-16LE" );
 
QByteArray utf8_bytes = "Hello word";
QString unicode = codec_utf8->toUnicode( utf8_bytes  );
QByteArray utf16le_bytes = codec_utf16le->fromUnicode( unicode );
 
 
Записан
Kn1fe
Гость
« Ответ #2 : Июль 25, 2016, 18:17 »

Код:
QByteArray Packets::changeEncoding(QString instr) {
    QTextCodec *codec_utf8 = QTextCodec::codecForName("UTF-8");
    QTextCodec *codec_utf16le = QTextCodec::codecForName("UTF-16LE");
    QByteArray utf8_bytes = instr.toStdString().c_str();
    QString unicode = codec_utf8->toUnicode(utf8_bytes);
    return codec_utf16le->fromUnicode(unicode);
}
Использование
Код:
    QByteArray text = changeEncoding("ez");
    qDebug() << text;
    qDebug() << text.length();
Почему то длинна получается 6 байтов на выводе, а должно быть 4

Записан
Kn1fe
Гость
« Ответ #3 : Июль 25, 2016, 19:20 »

Заметил странную особенность, что даже в пустой строке есть 2 байта, как оказалось их просто можно удалить из начала и прекрасно работает, списибо!
Код:
QByteArray Packets::changeEncoding(QString instr) {
    QTextCodec *codec_utf8 = QTextCodec::codecForName("UTF-8");
    QTextCodec *codec_utf16le = QTextCodec::codecForName("UTF-16LE");
    QByteArray utf8_bytes = instr.toStdString().c_str();
    return codec_utf16le->fromUnicode(codec_utf8->toUnicode(utf8_bytes)).remove(0, 2);
}
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июль 25, 2016, 20:05 »

Скорее всего это ByteOrderMark
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июль 26, 2016, 12:50 »

в 16 всегда есть BOM чтобы отличать LE/BE
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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