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

Groovy计算含特殊字符的字符串长度结果异常求助

问题:含特殊字符的JSON字符串长度计算错误

原Groovy脚本计算JSON字符串长度时,遇到İ、Ş这类Unicode特殊字符,得到的长度结果不符合预期。

输入数据

{"groupId":"5jb878adfs0k1fnzh4ijlvndi","caseId":"V12900","name":"EAE TEKNOLOJİ ARAŞTIRMA GELİŞTİRME SAN.VE TİC.A.Ş","providerTypes":["WATCHLIST"],
"entityType":"ORGANISATION","secondaryFields":[{"value":"ARE","typeId":"SFCT_6"}]}

原Groovy脚本

byte[] arr = jsonBody.toString().getBytes("UTF-8");
String s = new String (arr);    
j = s.length(); 
jlen = Integer.toString(j); 

解决方案

问题根源

这段代码做了无意义的编码转换:先把字符串转成UTF-8字节数组,再转回字符串,最后调用length()。但String.length()返回的是Unicode代码单元数量,并非UTF-8字节数。像İ、Ş这类字符在UTF-8中占2个字节,但作为Unicode代码单元仅算1个,若你的需求是统计UTF-8字节数,原逻辑完全错误;若要统计字符数,转字节再转回的操作不仅多余,还可能引入编码异常。

修正方案

根据实际需求选择对应方法:

需求1:统计JSON字符串的UTF-8字节数(最常见需求)

直接获取字节数组的长度,跳过冗余的字符串转换:

int utf8ByteLength = jsonBody.toString().getBytes("UTF-8").length;
String jlen = Integer.toString(utf8ByteLength);

需求2:统计实际Unicode字符数量

若要统计视觉上的字符个数,普通场景直接调用length()即可;如果包含Emoji这类占2个代码单元的字符,需改用codePointCount():

// 普通字符场景
int charCount = jsonBody.toString().length();
// 包含Emoji等代理对字符的场景
int actualCharCount = jsonBody.toString().codePointCount(0, jsonBody.toString().length());
String jlen = Integer.toString(actualCharCount);

额外优化

如果jsonBody是JSON对象而非字符串,建议用Groovy自带的JsonBuilder做序列化,确保编码逻辑严谨:

import groovy.json.JsonBuilder

def jsonBuilder = new JsonBuilder(jsonBody)
String jsonStr = jsonBuilder.toString()
int utf8ByteLength = jsonStr.getBytes("UTF-8").length;

内容的提问来源于stack exchange,提问作者AnirD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:51:53