如何清理含起始空字符的无效QString内容以得到真实空字符串?
如何清理含起始空字符的无效QString内容以得到真实空字符串?
首先得说清楚为什么trimmed()没用——QString的trimmed()方法只处理空白字符(比如空格、换行符、制表符这些),而\u0000是null字符,不在它的处理范围内,所以哪怕你调用trimmed,那些null字符还是会留在字符串里。
针对你的需求,我给你两个方向的解决方案:
1. 直接清理QString中的起始null字符
如果你的判断逻辑是「只要字符串开头是null字符,就视为空字符串」,可以写个简单的处理逻辑:
void MyClass::opcua_valueChanged(QString key, QVariant value) { QString rawStr = value.toString(); QString cleanedStr; // 跳过所有开头的null字符 int startIdx = 0; while (startIdx < rawStr.size() && rawStr.at(startIdx) == QChar('\0')) { startIdx++; } // 如果跳过之后没有有效内容,就返回空字符串;否则取有效部分 if (startIdx >= rawStr.size()) { cleanedStr = ""; } else { // 这里你也可以根据需求决定是否保留后面的乱码,如果你觉得后面的也是无效的,直接设为空即可 cleanedStr = rawStr.mid(startIdx); // 补充:如果不管后面有没有内容,只要开头有null就想返回空,直接用下面这行替代上面的判断 // cleanedStr = ""; } qDebug() << cleanedStr; }
如果只是想快速去掉所有null字符,也可以用replace:
QString cleanedStr = rawStr.replace(QChar('\0'), ""); if (cleanedStr.isEmpty()) { cleanedStr = ""; }
2. 排查数据类型是否解析错误
其实从你输出的乱码来看,我怀疑可能根本不是字符串类型的问题——你说从PLC读的是"string",但QtOpcUa可能把二进制数据(比如字节数组)当成字符串解析了,才会出现这种带null的乱码。
你可以试试用value.toByteArray()来获取原始二进制数据,而不是toString(),看看能不能得到正确的内容:
QByteArray rawData = value.toByteArray(); qDebug() << rawData;
如果这是字节数组类型,你可以根据PLC的协议来解析这些二进制数据,而不是强行转成QString。
备注:内容来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

