`
starbhhc
  • 浏览: 658435 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

微信公众帐号开发教程第4篇-文本消息的内容长度限制揭秘

 
阅读更多

相信不少朋友都遇到过这样的问题:当发送的文本消息内容过长时,微信将不做任何响应。那么到底微信允许的文本消息的最大长度是多少呢?我们又该如何计算文本的长度呢?为什么还有些人反应微信好像支持的文本消息最大长度在1300多呢?这篇文章会彻底解除大家的疑问。

 

接口文档中对消息长度限制为2048

以看到,接口文档中写的很明确:回复的消息内容长度不超过2048字节。那为什么很多人测试反应消息内容长度在1300多字节时,微信就不响应了呢?我想这问题应该在这部分人没有搞清楚到底该如何计算文本的字节数。

 

如何正确计算文本所占字节数

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

 

[java] view plaincopy
 
  1. public static void main(String []args)  {  
  2.     // 运行结果:4  
  3.     System.out.println("柳峰".getBytes().length);  
  4. }  

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

 

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

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

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

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

 

[java] view plaincopy
 
  1. public static void main(String []args) throws UnsupportedEncodingException  {  
  2.     // 运行结果:2  
  3.     System.out.println("柳峰".getBytes("ISO8859-1").length);  
  4.     // 运行结果:4  
  5.     System.out.println("柳峰".getBytes("GB2312").length);  
  6.     // 运行结果:4  
  7.     System.out.println("柳峰".getBytes("GBK").length);  
  8.     // 运行结果:6  
  9.     System.out.println("柳峰".getBytes("UTF-8").length);  
  10. }  

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

 

 

微信平台采用的编码方式及字符串所占字节数的计算

那么,在向微信服务器返回消息时,该采用什么编码方式呢?当然是UTF-8,因为我们已经在doPost方法里采用了如下代码来避免中文乱码了:

 

[java] view plaincopy
 
  1. // 将请求、响应的编码均设置为UTF-8(防止中文乱码)  
  2. request.setCharacterEncoding("UTF-8");  
  3. response.setCharacterEncoding("UTF-8");  

为了验证我所说了,我写了个例子来测试:

 

 

[java] view plaincopy
 
  1. private static String getMsgContent() {  
  2.     StringBuffer buffer = new StringBuffer();  
  3.     // 每行70个汉字,共682个汉字加1个英文的感叹号  
  4.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  5.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  6.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  7.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  8.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  9.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  10.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  11.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  12.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵你的手走过风风雨雨有什么困难我都陪你");  
  13.     buffer.append("不知道什么时候开始喜欢这里每个夜里都会来这里看你你长得多么美丽叫我不能不看你看不到你我就迷失了自己好想牵!");  
  14.     return buffer.toString();  
  15. }  
  16.   
  17. public static void main(String []args) throws Exception  {  
  18.     // 采用gb2312编码方式时占1365个字节  
  19.     System.out.println(getMsgContent().getBytes("gb2312").length);  
  20.     // 采用utf-8编码方式时占2047个字节  
  21.     System.out.println(getMsgContent().getBytes("utf-8").length);  
  22. }  

getMsgContent()方法返回的内容正是微信的文本消息最长能够支持的,即采用UTF-8编码方式时,文本消息内容最多支持2047个字节,也就是微信公众平台接口文档里所说的回复的消息内容长度不超过2048字节,即使是等于2048字节也不行,你可以试着将getMsgContent()方法里的内容多加一个英文符号,这个时候微信就不响应了。

同时,我们也发现,如果采用gb2312编码方式来计算getMsgContent()方法返回的文本所占字节数的结果是1365,这就是为什么很多朋友都说微信的文本消息最大长度好像只支持1300多字节,并不是接口文档中所说的2048字节,其实是忽略了编码方式,只是简单的使用了String类的getBytes()方法而不是getBytes("utf-8")方法去计算所占字节数。

 

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

 

[java] view plaincopy
 
  1. /** 
  2.  * 计算采用utf-8编码方式时字符串所占字节数 
  3.  *  
  4.  * @param content 
  5.  * @return 
  6.  */  
  7. public static int getByteSize(String content) {  
  8.     int size = 0;  
  9.     if (null != content) {  
  10.         try {  
  11.             // 汉字采用utf-8编码时占3个字节  
  12.             size = content.getBytes("utf-8").length;  
  13.         } catch (UnsupportedEncodingException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17.     return size;  
  18. }  

 

好了,本章节的内容就讲到这里,我想大家通过这篇文章所学到的应该不仅仅是2047这个数字,还应该对字符编码方式有一个新的认识。

分享到:
评论

相关推荐

    JAVA微信开发资料

    微信公众帐号开发教程第 6 篇-文本消息的内容长度限制揭秘 45 微信公众帐号开发教程第 7 篇-文本消息中换行符的使用.. 49 微信公众帐号开发教程第 8 篇-文本消息中使用网页超链接. 51 微信公众帐号开发教程第 9 篇-...

    微信公众帐号开发教程

    [037] 微信公众帐号开发教程第13篇-图文消息全攻略 - 柳峰的专栏 - 博客频道 - CSDN.NET [038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应 - 柳峰的专栏 - 博客频道 - CSDN.NET [040] 微信公众帐号...

    微信公共账号开发教程

    2. 微信公众帐号开发教程第2篇-微信公众帐号的类型(普通和会议) 3. 微信公众帐号开发教程第3篇-开发模式启用及接口配置 . 微信公众帐号开发教程第5篇-...6. 微信公众帐号开发教程第6篇-文本消息的内容长度限制揭秘

    java开发微信公众平台

    微信公众帐号开发教程第1 篇-引言 微信公众帐号开发教程第2 篇-微信公众帐号的类型(普通和会议) ...微信公众帐号开发教程第4 篇-消息及消息处理工具的封装 微信公众帐号开发教程第5 篇-各种消息的接收与响应

    微信小程序开发图解案例教程-源代码

    微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码微信小程序开发图解案例教程-源代码...

    微信开发实例 微信公众平台开发 之微信接口前期准备

    微信开发实例 微信公众平台开发教程-深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)1.微信接口前期准备。由北风网提供,微信开发实例微信公众平台基础篇: 1)微信公众平台简介:开发...

    微信公众账号开发教程

    经过这3个公众帐号的开发,对目前微信公众平台开放的api算是比较熟悉了,像文本消息、图文消息、音乐消息、语音消息、位置消息等全部用到过,菜单也使用过。所以,就有了写微信公众帐号开发教程的想法,将学习到的...

    微信公众平台最佳实践-源代码-方倍工作室

    自从方倍工作室在博客园推出微信公众平台开发系列教程后,受到广大微信开发人员及爱好者的热情关注,相头文章的日访问量高达上万人次,而《微信公众平台开发入门教程》一门阅读量早已超出20万,很多博文被很多有影响...

    微信平台开发-自动回复-文本-图片-视频

    微信平台开发-自动回复-文本-图片-视频—语音消息,以及地理位置接收。

    微信公众平台开发入门教程

    微信公众平台开发入门教程

    微信公众平台应用开发实战-完整扫描版 pdf 文档

    微信公众平台应用开发实战-完整扫描版 pdf 版本。 微信公众平台应用开发实战-完整扫描...第四部分(第8~9章)详细探讨了应对海量请求和恶意请求的方法,这是企业运营公众账号(尤其是服务号)时 微信 公众号 开发 pdf

    微信公众平台开发教程Java版

    微信公众平台开发教程Java版 微信公众平台开发教程Java版

    微信公众平台开发教程,Java

    微信公众平台的开发教程,用Java写的,挺有借鉴的意义

    微信公众平台开发教程4

    微信公众平台开发教程,适合初学者了解入门,用的是php语言,简单易懂,欢迎下载

    微信公众平台从入门到精通1-17

    第四章 微信公众平台编辑模式介绍 第五章 资讯应用实例 第六章 公众账号自动回复操作案例 番外篇 微信会议公众账号详解 第七章 公众平台开发模式介绍 第八章 新浪云计算平台注册和使用 第九章 用微信开发模式做欢迎...

    《微信公众平台入门到精通》--ZTalk

    共16期微信公众平台开发教程,微信平台的界面操作-->微信消息借口API-->新浪云平台SAE+PHP作为公众平台的服务端-->订阅事件响应-->SAE STORAGE-->收发文字、图文、音频、地理位置,处理退订事件-->SAE数据库、缓存、...

    微信公众账号开发教程(java)

    微信公众账号开发教程(java) 程主要是面向有一定Java编程基础的朋友 1)前沿知识:微信公众帐号的分类、两种模式各自的特点和区别、开发模式的配置使用等; 2)API中各类消息的使用(我已经对api进行封装并打成了jar...

Global site tag (gtag.js) - Google Analytics