Russian Qt Forum

Qt => Общие вопросы => Тема начата: Kn1fe от Июль 24, 2016, 23:43



Название: кодировка utf-8->utf16LE
Отправлено: Kn1fe от Июль 24, 2016, 23:43
Желательно с примером кода, пытался сделать через iconv и qtextcodec но не сработало. Платформа ubuntu 12, gcc4.6


Название: Re: кодировка utf-8->utf16LE
Отправлено: ssoft от Июль 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 );
 
 


Название: Re: кодировка utf-8->utf16LE
Отправлено: Kn1fe от Июль 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
(http://s020.radikal.ru/i721/1607/ba/822dee443a20.jpg)


Название: Re: кодировка utf-8->utf16LE
Отправлено: Kn1fe от Июль 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);
}


Название: Re: кодировка utf-8->utf16LE
Отправлено: Авварон от Июль 25, 2016, 20:05
Скорее всего это ByteOrderMark


Название: Re: кодировка utf-8->utf16LE
Отправлено: kambala от Июль 26, 2016, 12:50
в 16 всегда есть BOM чтобы отличать LE/BE