此篇文章爲轉載
相信不少朋友都遇到過這樣的問題:當發送的文本消息內容過長時,微信將不做任何響應。那麼到底微信允許的文本消息的最大長度是多少呢?我們又該如何計算文本的長度呢?爲什麼還有些人反應微信好像支持的文本消息最大長度在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支持柳峯哦!
謝謝柳峯老師:轉載地址:http://blog.csdn.net/lyq8479/article/details/8967824