知识点

相关文章

更多

最近更新

更多

[030] 微信公众帐号开发教程第6篇-文本消息的内容长度限制揭秘(转)

2019-03-02 00:58|来源: 网路

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

 

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

以看到,接口文档中写的非常明白:回复的消息内容长度不超过2048字节。那为什么非常多人測试反应消息内容长度在1300多字节时,微信就不响应了呢?我想这问题应该在这部分人沒有搞清晰究竟该怎样计算文本的字节数。

 

怎样正确计算文本所占字节数

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

 

[java]  view plain copy
 
  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 plain copy
 
  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编码方式时,一个中文占三个字节。

 

 

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

那么,在向微信server返回消息时,该採用什么编码方式呢?当然是UTF-8,由于我们已经在doPost方法里採用了例如以下代码来避免中文乱码了:

 

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

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

 

 

[java]  view plain copy
 
  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 plain copy
 
  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这个数字,还应该对字符编码方式有一个新的认识。

 

假设认为文章对你有所帮助,请留言支持或关注微信公众帐号xiaoqrobot支持柳峰哦!


转自:http://www.cnblogs.com/mfryf/p/3598257

相关问答

更多
  • 能使用的!微信 在安卓手机里可以使用,安装是用java 开发的,所以 可以用java开发
  • 微信公众平台开发注意事项: 一、微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请前往微信开放平台接入。 二、在申请到认证公众号之前,你可以先通过测试号申请系统,快速申请一个接口测试号,立即开始接口测试开发。 三、在开发过程中,可以使用接口调试工具来在线调试某些接口。 四、每个接口都有每日接口调用频次限制,可以在公众平台官网-开发者中心处查看具体频次。 五、在开发出现问题时,可以通过接口调用的返回码,以及报警排查指引(在公众平台 ...
  • 小猪cms还凑合,,有源码的 ,每周更新两三个模板的 ,你可以看下 ,,
  • 1. 微信小程序教程主要是前端技术。 2. 在学习下小程序的文档即可。
  • 这个貌似是做不到的,点击单图文肯定是链向一个页面的
  • 你这个问题太深奥了,去微信开发平台问吧. 网址是微信的全拼.com
  • 微网站开发模式教程:   第一步:申请消息接口   在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。Token可由开发者可以任意填写,用作生成签名。   第二步:验证URL有效性   开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:   开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回 echostr参数内容,则接入生效,成为开发 ...
  • 这个按照功能来算费用的。 有的功能比较简单开发费用就比较小,有些就会比较大。 一般情况下普通的开发3000-5000元足够满足了, 如果需要深度开发,那就要1万以上也是很正常的。
  • 注册公众号免费。但是后期的运营费用看公众号发展需求而定。
  • 我想通了,有2个UARTS,我正在使用第一个,而USBTX和USBRX正在使用它。 所以我只使用引脚D2和D8,UART2引脚,所以没有冲突。 I figured it out, there are 2 UARTS, I was using the first one and that one was being used by the USBTX and USBRX. So i just used pins D2 and D8, the UART2 pins so there was no conflic ...