如何将具有特殊字符的 QString 转换为字节流以通过 Linux 管道发送

How to convert QString with special characters into a byte stream to send it via Linux pipe

我有一个包含以 UTF-8 编码的特殊字符 (µ) 的 QString:

QString data = "197,45 \xc2\xb5m";

我需要通过 Linux 管道将该字符串发送到另一个程序。我试图将字符串转换成这样的东西:

char msg[15];    
for(int i = 0; i < data.length(); i++) {
    msg[i] = data.toUtf8()[i];
}
msg[data.length()] = '[=12=]';

我将 msg 发送到管道,但我只收到“197,45 µ”,而不是“197,45 µm”。我尝试读取读取端的数据:

char data[15];
read(fd, data, nbytes);

我对 character/string 转换了解不多,所以如果您能解释我应该如何解决这个问题,我将很高兴。谢谢。

在 QString 中存储 UTF-8 编码字节在概念上是错误的。为此使用 QByteArray,或者使用 QString::fromUtf8() 将 UTF-8 字符串文字转换为正确的 QString。要返回,请使用 qUtf8Printable 宏或 QString::toUtf8 获取 QByteArray.

您所做的似乎主要是将数据“序列化”到二进制管道中,因此一个有意义的选项是使用专为此目的设计的 QDataStream

类似于:

QByteArray buffer;
QDataStream stream(&buffer, QIODevice::WriteOnly);

QString data = "197,45 \xc2\xb5m";
stream << data;

sendToPipe(buffer.constData(), buffer.size());

另一边类似,使用operator>>从流中读取数据。

QByteArray buffer(dataPtr, size);
QDataStream stream(buffer);

QString data;
stream >> data;