Qt-将QString转换为Unicode QByteArray

use*_*152 5 unicode qt

我有一个客户端服务器应用程序,其中客户端将在Qt(Ubuntu)中,服务器将为C#。Qt客户端将以UTF-16编码格式发送字符串。我已使用QTextCodec类将其转换为UTF-16。但是无论何时进行转换,都将填充更多字符。例如

“ <绑定端点='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);
Run Code Online (Sandbox Code Playgroud)

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

gam*_*ure 5

尽管很久以前就问过这个问题,但我也遇到了同样的问题。解决方案是使用选项QTextCodec :: IgnoreHeader创建一个QTextEncoder。

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

QString str("Foobar")
QByteArray bytes  = encoderWithoutBom ->fromUnicode( s );
Run Code Online (Sandbox Code Playgroud)

这将导致没有BOM的QByteArray。


Arn*_*nce 2

开头的 \ff\fe 是UTF-16、little-endian 的Unicode 字节顺序标记(BOM) 。我不知道如何让 QTextCodec 忽略这一点,但如果你想从 UTF-16 的字符串中获取 QByteArray 而不带 BOM,你可以尝试这样做:

QString s("12345");
QByteArray b((const char*) (s.utf16()), s.size() * 2);
Run Code Online (Sandbox Code Playgroud)