C++ 如何将带有特殊字符的QString转换为字节流,通过Linux管道发送
我有一个QString,其中包含一个UTF-8编码的特殊字符(µ):C++ 如何将带有特殊字符的QString转换为字节流,通过Linux管道发送,c++,c,linux,qt,pipe,C++,C,Linux,Qt,Pipe,我有一个QString,其中包含一个UTF-8编码的特殊字符(µ): 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()] = '\0'; 我对字符
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()] = '\0';
我对字符/字符串转换不太了解,所以如果您能解释一下我应该如何处理这个问题,我将非常高兴。谢谢。在QString中存储UTF-8编码字节在概念上是错误的。使用QByteArray,或者使用
QString::fromUtf8()
将UTF-8字符串文本转换为正确的QString。要返回,请使用qtf8printable
宏或QString::toUtf8
获取QByteArray
您所做的工作似乎主要是将数据“序列化”到二进制管道中,因此一个有意义的选项是使用专门为此设计的QDataStream
比如:
QByteArray buffer;
QDataStream stream(&buffer, QIODevice::WriteOnly);
QString data = "197,45 \xc2\xb5m";
stream << data;
sendToPipe(buffer.constData(), buffer.size());
您想要的是UTF-8序列的长度,而不是
QChar
字符串的长度。类似于data.toUtf8().length
?@IanAbbott是的,这样更有意义。但是,如果我将其更改为msg[data.toUtf8().length()]='\0'
我又收到了一个字节,但看起来像这样的197,45µ?
是在更改了使用length()的两个位置之后,我只更改了一行。忘记了循环的。然后它似乎起作用了。非常感谢。谢谢你的想法,你可能是对的。但是QString是我现在必须处理的遗留代码的一部分,我不敢更改任何东西。这是一个有趣的方法。但正如我在上面的评论中提到的,它现在运行得相当可靠。如果我转向你的想法,我会有什么好处吗?我认为这种方法的好处可能是:-保持更高的级别:序列化细节主要由Qt解决,因此不必为此费心(除非你需要一些真正具体的东西)。QDataStream提供了一些选项(例如endianness等)可伸缩性:如果您认为将来可能需要传输比单个字符串更多的数据,那么添加数据可能更容易。但这取决于您的用例。
QByteArray buffer;
QDataStream stream(&buffer, QIODevice::WriteOnly);
QString data = "197,45 \xc2\xb5m";
stream << data;
sendToPipe(buffer.constData(), buffer.size());
QByteArray buffer(dataPtr, size);
QDataStream stream(buffer);
QString data;
stream >> data;