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

     最近在搞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;    
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值