You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清理含起始空字符的无效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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:20:32