2010-08-30 138 views
5

我有一个客户端 - 服务器应用程序,其中客户端将在Qt(Ubuntu)和服务器将C#。 Qt客户端将以UTF-16编码格式发送字符串。 我已经使用QTextCodec类转换为UTF-16。但是每当转换发生时,它将被填充更多的字符。例如Qt - 将QString转换为Unicode QByteArray

“<绑定端点= '2_3'/ >”

将改为

“\ 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); 

我甚至试过th e QTextStream,QDataStream等编码。但每次我都会得到相同的结果。我在这里做错了什么?

回答

3

开头的\ ff \ fe是UTF-16的Unicode字节顺序标记(BOM),小尾数。我不知道如何让QTextCodec来给ommit说,但如果你想从UTF-16字符串中的QByteArray没有BOM,你可以试试这个:

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

虽然问法不久前, 我有同样的问题。解决方案是使用选项QTextCodec :: IgnoreHeader创建一个QTextEncoder。

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

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

这将导致没有BOM的QByteArray。