相信不少朋友都遇到過這樣的問題:當(dāng)發(fā)送的文本消息內(nèi)容過長(zhǎng)時(shí),,微信將不做任何響應(yīng)。那么到底微信允許的文本消息的最大長(zhǎng)度是多少呢,?我們又該如何計(jì)算文本的長(zhǎng)度呢,?為什么還有些人反應(yīng)微信好像支持的文本消息最大長(zhǎng)度在1300多呢?這篇文章會(huì)徹底解除大家的疑問,。
接口文檔中對(duì)消息長(zhǎng)度限制為2048
可以看到,,接口文檔中寫的很明確:回復(fù)的消息內(nèi)容長(zhǎng)度不超過2048字節(jié)。那為什么很多人測(cè)試反應(yīng)消息內(nèi)容長(zhǎng)度在1300多字節(jié)時(shí),,微信就不響應(yīng)了呢,?我想這問題應(yīng)該在這部分人沒有搞清楚到底該如何計(jì)算文本的字節(jié)數(shù)。
如何正確計(jì)算文本所占字節(jié)數(shù) 計(jì)算文本(字符串)所占字節(jié)數(shù),,大家第一個(gè)想到的應(yīng)該就是String類的getBytes()方法,,該方法返回的是字符串對(duì)應(yīng)的字節(jié)數(shù)組,再計(jì)算數(shù)組的length就能夠得到字符串所占字節(jié)數(shù),。例如: - public static void main(String []args) {
-
- System.out.println("柳峰".getBytes().length);
- }
上面的示例中計(jì)算了兩個(gè)中文所占的字節(jié)數(shù)為4,,即一個(gè)漢字占2個(gè)字節(jié)。真的是這樣嗎,?其實(shí)我們忽略了一個(gè)問題:對(duì)于不同的編碼方式,,中文所占的字節(jié)數(shù)也不一樣!這到底要怎么呢,?在上面的例子中,,我們并沒有指定編碼方式,那么會(huì)使用操作系統(tǒng)所默認(rèn)的編碼方式,。先來看我得出的三條結(jié)論:1)如果上面的例子運(yùn)行在默認(rèn)編碼方式為ISO8859-1的操作系統(tǒng)平臺(tái)上,,計(jì)算結(jié)果是2,; 2)如果上面的例子運(yùn)行在默認(rèn)編碼方式為gb2312或gbk的操作系統(tǒng)平臺(tái)上,計(jì)算結(jié)果是4,; 3)如果上面的例子運(yùn)行在默認(rèn)編碼方式為utf-8的操作系統(tǒng)平臺(tái)上,,計(jì)算結(jié)果是6; 如果真的是這樣,,是不是意味著String.getBytes()方法在我們的系統(tǒng)平臺(tái)上默認(rèn)采用的是gb2312或gbk編碼方式呢,?我們?cè)賮砜匆粋€(gè)例子: - public static void main(String []args) throws UnsupportedEncodingException {
-
- System.out.println("柳峰".getBytes("ISO8859-1").length);
-
- System.out.println("柳峰".getBytes("GB2312").length);
-
- System.out.println("柳峰".getBytes("GBK").length);
-
- System.out.println("柳峰".getBytes("UTF-8").length);
- }
這個(gè)例子是不是很好地證明了我上面給出的三條結(jié)論呢?也就是說采用ISO8859-1編碼方式時(shí),,一個(gè)中/英文都只占一個(gè)字節(jié),;采用GB2312或GBK編碼方式時(shí),一個(gè)中文占兩個(gè)字節(jié),;而采用UTF-8編碼方式時(shí),,一個(gè)中文占三個(gè)字節(jié)。
微信平臺(tái)采用的編碼方式及字符串所占字節(jié)數(shù)的計(jì)算 那么,,在向微信服務(wù)器返回消息時(shí),,該采用什么編碼方式呢?當(dāng)然是UTF-8,,因?yàn)槲覀円呀?jīng)在doPost方法里采用了如下代碼來避免中文亂碼了: -
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
為了驗(yàn)證我所說了,我寫了個(gè)例子來測(cè)試:- private static String getMsgContent() {
- StringBuffer buffer = new StringBuffer();
-
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風(fēng)風(fēng)雨雨有什么困難我都陪你");
- buffer.append("不知道什么時(shí)候開始喜歡這里每個(gè)夜里都會(huì)來這里看你你長(zhǎng)得多么美麗叫我不能不看你看不到你我就迷失了自己好想牽!");
- return buffer.toString();
- }
-
- public static void main(String []args) throws Exception {
-
- System.out.println(getMsgContent().getBytes("gb2312").length);
-
- System.out.println(getMsgContent().getBytes("utf-8").length);
- }
getMsgContent()方法返回的內(nèi)容正是微信的文本消息最長(zhǎng)能夠支持的,,即采用UTF-8編碼方式時(shí),文本消息內(nèi)容最多支持2047個(gè)字節(jié),,也就是微信公眾平臺(tái)接口文檔里所說的回復(fù)的消息內(nèi)容長(zhǎng)度不超過2048字節(jié),,即使是等于2048字節(jié)也不行,你可以試著將getMsgContent()方法里的內(nèi)容多加一個(gè)英文符號(hào),,這個(gè)時(shí)候微信就不響應(yīng)了,。 同時(shí),我們也發(fā)現(xiàn),,如果采用gb2312編碼方式來計(jì)算getMsgContent()方法返回的文本所占字節(jié)數(shù)的結(jié)果是1365,,這就是為什么很多朋友都說微信的文本消息最大長(zhǎng)度好像只支持1300多字節(jié),并不是接口文檔中所說的2048字節(jié),,其實(shí)是忽略了編碼方式,只是簡(jiǎn)單的使用了String類的getBytes()方法而不是getBytes("utf-8")方法去計(jì)算所占字節(jié)數(shù),。
Java中utf-8編碼方式時(shí)所占字節(jié)數(shù)的計(jì)算方法封裝 -
-
-
-
-
-
- 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;
- }
好了,,本章節(jié)的內(nèi)容就講到這里,我想大家通過這篇文章所學(xué)到的應(yīng)該不僅僅是2047這個(gè)數(shù)字,,還應(yīng)該對(duì)字符編碼方式有一個(gè)新的認(rèn)識(shí),。
|