微信公众帐号开发教程之文本消息长度限制详解

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

开发教程之文本消息长度限制详解-java公众平台开发详解">

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

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

计算文本(字符串)所占字节数,大家第一个想到的应该就是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编码方式时,一个中文占三个字节。

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

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

// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
 代码如下 复制代码
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("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);
}

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

同时,我们也发现,如果采用gb2312编码方式来计算getMsgContent()方法返回的文本所占字节数的结果是1365,这就是为什么很多朋友都说微信的文本消息最大长度好像只支持1300多字节,并不是接口文档中所说的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;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索字符串
, 编码
代码
java公众平台开发详解、磁盘队列长度详解、python 文本处理详解、微信公众号功能详解、微信公众号详解,以便于您获取更多的相关知识。

时间: 2024-08-31 09:30:50

微信公众帐号开发教程之文本消息长度限制详解的相关文章

微信公众帐号开发教程(六) 文本消息的内容长度限制揭秘

相信不少朋友都遇到过这样的问题:当发送的文本消息内容过长时,微信将不做任何响应.那么到底微信 允许的文本消息的最大长度是多少呢?我们又该如何计算文本的长度呢?为什么还有些人反应微信好像支持的 文本消息最大长度在1300多呢?这篇文章会彻底解除大家的疑问. 接口文档中对消息长度限制为 2048 开发教程(六) 文本消息的内容长度限制揭秘-揭秘时政的微信公众号"> 可以看到,接口文档中写的很明确:回复的消息内容长度不超过2048字节.那为什么很多人测试反应消息 内容长度在1300多字节时,微信

微信公众帐号开发教程(八) 文本消息中使用网页超链接

本文主要介绍网页超链接的作用以及如何在文本消息中使用网页超链接. 网页超链接的作用 我想但凡是熟悉HTML的朋友,对超链接一定不会陌生.而今天我们要讨论和使用的只是超链接中的其 中一种---网页超链接,即使用HTML中的<a>标签将某段文字链接到其他网页上去,示例如下: <a href="http://blog.csdn.net/lyq8479">柳峰的博客</a> 上面是一段标 准的HTML代码,实现了一个网页超链接,即将"柳峰的博客&q

微信公众帐号开发教程(七) 文本消息中换行符的使用

本篇文章主要介绍在文本消息中使用换行符的好处以及如何使用换行符. 最近一个月虽然抽不出时 间写博客,但却一直在认真答复大家提出的问题.收到这么多的回复.关注和答谢,还是蛮有成就感的,让我 觉得做这件事越来越有意义,更加坚定了我继续写下去的决心.经过前面六篇文章的讲解,相信在看文章的你 ,已经掌握了微信公众帐号的基础开发知识(基于Java),如框架搭建.API封装.消息接收与回复等:接下 来的系列文章将专注于讲解公众帐号开发中的技巧及实用功能的开发(如天气查询.周边搜索.人机对话等) . 使用换行

微信公众帐号开发教程(13) 图文消息全攻略

引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知 道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本消息的 使用示例,大家就能够照猫画虎的,或许是因为我的绘画功底太差,画出的那只猫本来就不像猫吧-- 本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式.标题取名为"图 文消息全攻略",这绝对不是标题党,是想借此机会把大家对图文消息相关的问题.疑虑.障碍全部清除掉.

微信公众帐号开发教程之图文消息全攻略_java

引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本消息的使用示例,大家就能够照猫画虎的,或许是因为我的绘画功底太差,画出的那只猫本来就不像猫吧-- 本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式.标题取名为"图文消息全攻略",这绝对不是标题党,是想借此机会把大家对图文消息相关的问题.疑虑.障碍全部清除掉. 图文消

微信公众帐号开发教程(五) 各种消息的接收与响应

前一篇文章里我们已经把微信公众平台接口中消息及相关操作都进行了封装,本章节将主要介绍如何接收 微信服务器发送的消息并做出响应. 明确在哪接收消息 从微信公众平台接口消息指南中可以了 解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的 URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息.处理消息和响应消息. 接收.处理.响应消息 下面先来看我已经写好的CoreServlet的完整代码: package o

微信公众帐号开发教程(一) 引言

接触微信公众帐号已经有两个多月的时间了,在这期间,除了陆续完善个人公众帐号xiaoqrobot以外,还 带领团队为公司开发了两个企业应用:一个是普通类型的公众帐号,另一个是会议类型的公众帐号.经过这3 个公众帐号的开发,对目前微信公众平台开放的api算是比较熟悉了,像文本消息.图文消息.音乐消息.语 音消息.位置消息等全部用到过,菜单也使用过.所以,就有了写微信公众帐号开发教程的想法,将学习到的 技术经验分享出来,帮助更多需要的朋友,也希望借此认识同行的朋友,共同交流,共同进步! 下面 将对即将

微信公众帐号开发教程(十一) 符号表情的发送(上)

题外话(可以略过) 相信这篇文章已经让大家等的太久了,不是我故弄玄虚.吊大家胃口,而是写 一篇文章真的需要花太多的时间.也许一篇文章,你们花3-5分钟就看完了.就学会掌握了,而我却要花2-3个 小时的时间来完成,也许只有用心写过文章的人才能体会,希望大家能够相互体谅! 也曾经有人对我 说,我写的东西太初级,都是入门级的东西.好吧,我承认众口难调,很难满足所有的读者,再加上我自己也 只是个新手,一个4月前才听说微信公众平台这个词的初学者,谢谢你们以不同方式对我的激励,我会更加努 力的! 第9篇文章

微信公众帐号开发教程(九) QQ表情的发送与接收

我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述 ,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是如何在微信公众平台使用 QQ表情,即在微信公众帐号开发模式下,如何发送QQ表情给用户,以及如何识别用户发来的是QQ表情. QQ表情代码表 首先需要明确的是:QQ表情虽然呈现为一张张动态的表情图片,但在微信公众平 台的消息接口中却是属于文本消息:也就是说当用户向公众帐号发送QQ表情时,公众帐号后台程序接收到的消 息类型MsgTyp