Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将带有特殊字符的QString转换为字节流,通过Linux管道发送_C++_C_Linux_Qt_Pipe - Fatal编程技术网

C++ 如何将带有特殊字符的QString转换为字节流,通过Linux管道发送

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,其中包含一个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中存储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;