2010-08-30 17 views
5

Tengo una aplicación cliente-servidor donde el cliente estará en Qt (Ubuntu) y el servidor será C#. El cliente de Qt enviará las cadenas en formato codificado UTF-16. He usado la clase QTextCodec para convertir a UTF-16. Pero cada vez que ocurre la conversión, se rellena con algunos caracteres más. Por ejemploQt - Conversión de QString a Unicode QByteArray

"< bind punto final = '2_3'/>"

se cambiará a

"\ 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 "

Tengo el siguiente código que convierte el QString a QByteArray

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

Incluso he intentado th e QTextStream, QDataStream, etc. para la codificación. Pero cada vez que termino con el mismo resultado. ¿Estoy haciendo algo mal aquí?

Respuesta

3

La \ ff \ fe al principio es la marca de orden de bytes Unicode (BOM) para UTF-16, little-endian. No estoy seguro de cómo obtener el QTextCodec a ommit eso, pero si usted desea conseguir un QByteArray de una cadena en UTF-16 sin la lista de materiales que podría intentar esto:

QString s("12345"); 
QByteArray b((const char*) (s.utf16()), s.size() * 2); 
4

Aunque la pregunta se hace mucho , Yo tuve el mismo problema. La solución es crear un QTextEncoder con la opción QTextCodec :: IgnoreHeader.

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

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

Esto dará como resultado un QByteArray sin BOM.

Cuestiones relacionadas