正确计算文本所占字节数

计算文本(字符串)所占字节数,大家第一个想到的应该就是String类的getBytes()方法,该方法返回的是字符串相应的字节数组,再计算数组的length就行得到字符串所占字节数。比如:

 

public static void main(String []args)  {  
   // 执行结果:4  
   System.out.println("柳峰".getBytes().length);  
} 

上面的演示例子中计算了两个中文所占的字节数为4,即一个汉字占2个字节。真的是这样吗?事实上我们忽略了一个问题:对于不同的编码方式,中文所占的字节数也不一样!这究竟要怎么呢?在上面的样例中,我们并沒有指定编码方式,那么会使用操作系统所默认的编码方式。先来看我得出的三条结论:

 

1)假设上面的样例执行在默认编码方式为ISO8859-1的操作系统平台上,计算结果是2;

2)假设上面的样例执行在默认编码方式为gb2312或gbk的操作系统平台上,计算结果是4;

3)假设上面的样例执行在默认编码方式为utf-8的操作系统平台上,计算结果是6;

假设真的是这样,是不是意味着String.getBytes()方法在我们的系统平台上默认採用的是gb2312或gbk编码方式呢?我们再来看一个样例:

public static void main(String []args) throws UnsupportedEncodingException  {  
    // 执行结果:2  
    System.out.println("柳峰".getBytes("ISO8859-1").length);  
    // 执行结果:4  
    System.out.println("柳峰".getBytes("GB2312").length);  
    // 执行结果:4  
    System.out.println("柳峰".getBytes("GBK").length);  
    // 执行结果:6  
    System.out.println("柳峰".getBytes("UTF-8").length);  
}  

这个样例是不是非常好地证明了我上面给出的三条结论呢?也就是说採用ISO8859-1编码方式时,一个中/英文都仅仅占一个字节;採用GB2312或GBK编码方式时,一个中文占两个字节;而採用UTF-8编码方式时,一个中文占三个字节。

 

为了验证我所说了,我写了个样例来測试:

private static String getMsgContent() {  
    StringBuffer buffer = new StringBuffer();  
    // 每行70个汉字,共682个汉字加1个英文的感叹号  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
    buffer.append("不知道什么时候開始喜欢这里每一个夜里都会来这里看你你长得多么漂亮叫我不能不看你看不到你我就迷失了自己好想牵!");  
    return buffer.toString();  
}  
  
public static void main(String []args) throws Exception  {  
    // 採用gb2312编码方式时占1365个字节  
    System.out.println(getMsgContent().getBytes("gb2312").length);      // 採用utf-8编码方式时占2047个字节  
    System.out.println(getMsgContent().getBytes("utf-8").length);  
}  

假设採用gb2312编码方式来计算getMsgContent()方法返回的文本所占字节数的结果是1365,并非2048字节,事实上是忽略了编码方式,仅仅是简单的使用了String类的getBytes()方法而不是getBytes("utf-8")方法去计算所占字节数。

 

Java中utf-8编码方式时所占字节数的计算方法封装

/** 
 * 计算採用utf-8编码方式时字符串所占字节数 
 *  
 * @param content 
 * @return 
 */  
public static int getByteSize(String content) {  
    int size = 0;  
    if (null != content) {  
        try {  
            // 汉字採用utf-8编码时占3个字节  
            size = content.getBytes("utf-8").length;  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
    }  
    return size;  
} <strong> </strong>



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值