8.2.2 计算字符串所占字节数
在Java中,要计算字符串所占的字节数,需要用到String类的getBytes()方法,该方法返回字符串所对应的字节数组,再访问字节数组的length属性就能得到字符串所占的字节数。示例代码如下:
- public static void main(String[] args) {
- String source = "微信";
- // 计算字符串source所占字节数
- int length = source.getBytes().length;
- // 运行结果:4
- System.out.println(length);
- }
可以看出,字符串“微信”所占的字节数为4,即一个中文占2字节。其实这里我们忽略了一个很重要的因素——字符编码方式,对于不同的编码方式,中文所占的字节数可能会不一样。在上面的示例中,我们没有显式地指定编码方式,因此会采用操作系统默认的编码方式(中文操作系统默认的编码方式通常为GB2312或GBK)。再来看下面这个例子:
- public static void main(String[] args) throws Exception {
- // 运行结果: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编码时,一个中文占1字节;采用GB2312或GBK编码时,一个中文占2字节;采用UTF-8编码时,一个中文占3字节。所以,要计算字符串所占字节数,必须先搞清楚在响应消息时使用的编码方式。在4.4.4节中编写CoreServlet类的doPost()方法时,为了防止中文乱码我们添加了如下代码:
- // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
由此可见,公众账号后台在响应消息时使用的编码方式为UTF-8。计算文本消息内容在UTF-8编码方式下所占字节数的方法如下:
- /**
- * 计算采用UTF-8编码方式时字符串所占字节数
- *
- * @param content
- * @return
- */
- public static int getByteSize(String content) {
- int size = 0;
- if (null != content) {
- try {
- size = content.getBytes("UTF-8").length;
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- return size;
- }