相信不少朋友都遇到過這樣的問題:當發送的文本消息內容過長時,微信將不做任何響應。那么到底微信允許的文本消息的最大長度是多少呢?我們又該如何計算文本的長度呢?為什么還有些人反應微信好像支持的文本消息最大長度在1300多呢?這篇文章會徹底解除大家的疑問。
接口文檔中對消息長度限制為2048
可以看到,接口文檔中寫的很明確:回復的消息內容長度不超過2048字節。那為什么很多人測試反應消息內容長度在1300多字節時,微信就不響應了呢?我想這問題應該在這部分人沒有搞清楚到底該如何計算文本的字節數。
如何正確計算文本所占字節數
計算文本(字符串)所占字節數,大家第一個想到的應該就是String類的getBytes()方法,該方法返回的是字符串對應的字節數組,再計算數組的length就能夠得到字符串所占字節數。例如:
- public static void main(String []args) {
- // 運行結果:4
- System.out.println("柳峰".getBytes().length);
- }
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);
- }
微信平台采用的編碼方式及字符串所占字節數的計算
那么,在向微信服務器返回消息時,該采用什么編碼方式呢?當然是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;
- }
好了,本章節的內容就講到這里,我想大家通過這篇文章所學到的應該不僅僅是2047這個數字,還應該對字符編碼方式有一個新的認識。
如果覺得文章對你有所幫助,請留言支持或關注微信公眾帳號xiaoqrobot支持柳峰哦!
- 本文已收錄於以下專欄:
- 微信公眾平台開發