Java String对中文长度的计算问题

本文介绍了在Java中处理中文字符串时遇到的一个常见问题:使用String的length()方法得到的长度与按照字节流计算得到的长度不一致。文章详细解释了这一现象的原因,并提供了解决方案。
Java String对中文长度的计算问题  


2010-07-30 13:36:38|  分类: java |字号 订阅
Java String对中文长度的计算问题


今天在农行测试系统,碰到个很恶心的问题。


我通过socket发到银行服务器的报文,总是后面少了几位,银行截取字符串是按照我在报文头传过去的报文总长度计算的。


然后怀疑我发过去的报文长度计算不对。但是这个是一个很简单的string.length()函数计算出来的长度,应该不会有错。


继续找原因,发现是Java和银行端程序对于中文的长度计算算法不同,造成这种错误。


如果一个中文字符串:  银行


Java中如果这样计算长度:
String str = "银行";
System.out.println(str.length());
那么得出的长度是2


但是银行服务器端中文是按照byte流的长度来计算的,所以计算出来的长度是4


最后在程序中,不能使用Java String的length方法来计算报文总长度,需要把它转换成为 byte数组来计算数组总长度。


System.out.println(str.getBtyes().length);


问题解决


原文链接 http://feng10251225.blog.163.com/blog/static/63122798201063013638937/

### 计算中文字符长度方法Java中处理字符串时,对于不同类型的字符集(如ASCII和Unicode),其长度计算方式有所不同。为了正确计算包含中文字符在内的字符串长度,可以采用多种方法。 #### 使用 `String.length()` `String.length()` 方法返回的是字符串中的字符数量,而不是占用的字节数量。对于单个汉字,在UTF-16编码下通常会被视为两个char单位,因为它们属于基本多文种平面(BMP)之外的增补字符[^1]: ```java public class Main { public static void main(String[] args) { String chineseStr = "你好世界"; System.out.println(chineseStr.length()); // 输出4 } } ``` 此代码片段展示了当使用 `length()` 函数来获取含有四个汉字的字符串 `"你好世界"` 的长度时会得到数值4,这是因为每个汉字都被认为是一个单独的字符单元。 然而需要注意的是,如果遇到超出BMP范围内的特殊字符,则可能需要更复杂的逻辑来进行精确计数。 #### 处理增补字符(Supplementary Characters) 针对那些无法通过单一char表示的支持int型码位的补充字符,应当利用 `Character.toChars(int codePoint)` 或者直接操作code point的方式进行转换并统计实际显示宽度: ```java import java.util.ArrayList; import java.util.List; public class SupplementaryCharCounter { private static int countSupplementaryCharacters(String str){ List<Integer> codePoints = new ArrayList<>(); for (int i = 0; i < str.length(); ) { int cp = str.codePointAt(i); codePoints.add(cp); i += Character.charCount(cp); } return codePoints.size(); } public static void main(String[] args) { String sampleText = "\ud83c\udf89"; // 表情符号作为例子 System.out.println(countSupplementaryCharacters(sampleText)); // 应该输出1而非2 } } ``` 上述程序定义了一个辅助函数用于遍历整个输入串并将每一个有效的unicode码点加入列表之中;最后返回这个列表大小即代表了真实的字符数目。这里特别注意到了像表情这样的非BMP字符也能被准确识别出来作为一个整体对待。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值