Qt - Преобразование QString в Unicode QByteArray - PullRequest
5 голосов
/ 30 августа 2010

У меня есть клиент-серверное приложение, где клиент будет в Qt (Ubuntu), а сервер будет в C #.Клиент Qt отправит строки в кодированном формате UTF-16.Я использовал класс QTextCodec для преобразования в UTF-16.Но всякий раз, когда происходит преобразование, оно будет дополнено еще несколькими символами.Например

будет изменено на

» \ ff \ fe <\ 0b \ 0i \ 0n \ 0d \ 0 \ 0e \ 0n \ 0d \ 0p \ 0o \ 0i \ 0n \ 0t \0 = \ 0 '\ 02 \ 0_ \ 03 \ 0' \ 0 / \ 0> \ 0 \ 0 \ 0 "

У меня есть следующий код, который преобразует QString в QByteArray

//'socketMessage' is the QString, listener is the QTcpSocket
QTextCodec *codec = QTextCodec::codecForName("UTF-16");
QByteArray data = codec->fromUnicode(socketMessage);
listener->write(data);

Я даже пробовал QTextStream, QDataStream и т. Д. Для кодирования. Но каждый раз, когда я получаю один и тот же результат. Я что-то здесь не так делаю?

Ответы [ 2 ]

5 голосов
/ 13 января 2013

Хотя вопрос задан давно, у меня была такая же проблема.Решением этой проблемы является создание QTextEncoder с опцией QTextCodec :: IgnoreHeader.

QTextCodec *codec = QTextCodec::codecForName("UTF-16");
QTextEncoder *encoderWithoutBom = codec->makeEncoder( QTextCodec::IgnoreHeader );

QString str("Foobar")
QByteArray bytes  = encoderWithoutBom ->fromUnicode( s );

Это приведет к QByteArray без спецификации.

2 голосов
/ 30 августа 2010

\ ff \ fe в начале - это метка порядка байтов Unicode (BOM) для UTF-16 с прямым порядком байтов. Я не уверен, как заставить QTextCodec пропустить это, но если вы хотите получить QByteArray из строки в UTF-16 без спецификации, вы можете попробовать это:

QString s("12345");
QByteArray b((const char*) (s.utf16()), s.size() * 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...