JAVA中String.length()中文只算一个字节

  • Post author:
  • Post category:java


最近在搞APK玩的时候遇到一个问题,java中String.length()函数计算中文字符时只算做一个字符长度,但是在c语言中,当我通过recv函数来读取时,虽然字符长度可能少了,但是居然也能全部读出来,这个还真没搞懂,不过问题的关键不在这,关键是C语言中的strlen()函数计算字符串长度时,由于是utf-8语言环境,中文是占三个字节的。所以长度不一致,导致服务端程序出错。我服务端是通过一个while循环来读取数据的,因为有遇到过数据比较大时,socket通道是分包发送的,一次性读取某个比较大的数据时,会发生丢数据的想象,虽然网上讲(协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的),但是我的buf长度足够大,还是会丢失,具体原因也没找到,总之,就多调用几回recv就ok了 。言归正传,解决客户端和服务端计算包含中文字符串长度不一致的问题,我在客户端通过计算字符串中包含的中文字符个数*2+String.length()的方就解决了。  方法网上很多。

public int getChineseNum()

{

String regEx = “[\\u4e00-\\u9fa5]”;

Pattern p = Pattern.compile(regEx);

Matcher m = p.matcher(s);

while(m.find())

count++;

return count;

}