CODESYS中如何正确拼接两个WSTRING类型字符串
CODESYS 两个WSTRING类型字符串拼接实现方案
通过STRING中转拼接的方案确实会丢失非ASCII字符(如中文、多语种特殊符号),不建议使用,可通过以下两种方案实现无编码损失的WSTRING拼接:
方案1:调用内置宽字符专用函数
- CODESYS 3.5 SP10及以上版本的
Standard标准库已经对CONCAT做了WSTRING类型重载,直接传入两个WSTRING类型参数即可完成拼接,无需额外转码。 - 若当前版本无对应重载,可直接调用库中自带的宽字符专用拼接函数
WCONCAT,函数入参为两个WSTRING类型值,返回值为拼接完成的WSTRING结果,全程不会修改字符编码。
调用示例:ws_textOut := WCONCAT("E ", ws_TextIn);
方案2:手动内存拷贝实现(全版本兼容)
如果当前运行环境找不到上述内置函数,可基于WSTRING的UTF-16编码特性(每个字符占2字节,以16位0值为字符串终止符),通过内存拷贝实现拼接,无第三方库依赖:
FUNCTION WConcat_Custom : WSTRING(1024) // 返回值长度可根据实际业务需求调整 VAR_INPUT wsA: WSTRING; wsB: WSTRING; END_VAR VAR lenA: DINT; lenB: DINT; pDest: POINTER TO BYTE; END_VAR // 计算两个宽字符串的字节长度(不含末尾终止符) lenA := StrLenW(ADR(wsA)) * 2; lenB := StrLenW(ADR(wsB)) * 2; // 拷贝第一个字符串到目标缓冲区 pDest := ADR(WConcat_Custom); SysMemCpy(pDest, ADR(wsA), lenA); // 拼接第二个字符串,同步拷贝末尾的2字节终止符 pDest := pDest + lenA; SysMemCpy(pDest, ADR(wsB), lenB + 2);
- 上述代码使用的
StrLenW、SysMemCpy均为CODESYS默认引用的SysUtils、SysMem标准库函数,所有正式版本均支持。 - 注意根据业务场景调整返回值WSTRING的预设长度,避免字符串长度超出缓冲区导致内存溢出。
内容的提问来源于stack exchange,提问作者SGKlee
相关产品推荐
相关产品推荐

