Qt - 将 QString 转换为 Unicode QByteArray

Posted

技术标签:

【中文标题】Qt - 将 QString 转换为 Unicode QByteArray【英文标题】:Qt - Converting QString to Unicode QByteArray 【发布时间】:2010-08-30 17:01:54 【问题描述】:

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

""

将改为

"\ff\fe\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 等进行编码。但每次我都得到相同的结果。我在这里做错了吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于Qt - 将 QString 转换为 Unicode QByteArray的主要内容,如果未能解决你的问题,请参考以下文章

QT读取二进制文件,然后将其转换为QString

在Qt中如何将QString转换为const char*

如何在 Qt 中将 QVariant 转换为 QString,反之亦然?

Qt中int转换为QString的方法

在 Qt 中将 WCHAR 转换为 QString

如何将QString转换为char *或者相反