引言
在一次项目开发做文件处理发送的时候,出现了字段长度超限的问题,于是又把文件字段长度增加了几位,发现还是超限报错,想了很久才发现问题。
正文
由于平台的原因,发送接收数据都得配置报文,其实就是配置xml文件,只是这个平台把配置xml文件都封装好用软件可视化了。这个传输文件也用报文形式实现传输,其中文件字段的长度是获取了文件长度那个字段,因此每次发送前都的给这个长度字段赋值,以此来定文件字段的长度。
但是问题来了这个文件字段配置的是byte类型的,然后把String字符串放进去的时候报长度超限了,因为给文件长度字段赋的是String字符串的长度(通过length()方法获取的字符串长度),之前在发送base64字符串的时候没出现过问题。
其中原因就是这次的字符串出现了汉字,一个汉字的String字符串,“汉”,在utf-8编码中占3个字节,在gbk编码中占2个字节,而用length()方法获取这个字符串长度是1,以下为测试结果:
测试代码:
String str = "汉";
System.out.println(str.length());
byte[] strutf = str.getBytes(StandardCharsets.UTF_8);
byte[] strgbk = str.getBytes("GBK");
System.out.println(strutf.length);
System.out.println(strgbk.length);
输出结果:
1
3
2
结论
所以根据以上测试可以得到结论,用String字符串的length()方法获取的字符串长度当作了文件字段的长度,而实际字符串存入byte类型的字段中时长度是按btye类型算的,因此实际存入长度要大于字符串获取的长度,才导致了长度超限的报错。