Qt - 将QString转换为Unicode QByteArray

时间:2010-08-30 17:01:54

标签: qt unicode

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

“< bind endpoint ='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);

我甚至尝试过QTextStream,QDataStream等进行编码。但每次我都得到相同的结果。我在这里做错了吗?

2 个答案:

答案 0 :(得分:5)

虽然很久以前就提出这个问题,但我遇到了同样的问题。它的解决方案是使用选项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。

答案 1 :(得分:2)

开头的\ ff \ fe是UTF-16的Unicode字节顺序标记(BOM),little-endian。我不知道如何让QTextCodec省略,但是如果你想从没有BOM的UTF-16字符串中获取QByteArray,你可以试试这个:

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