微信公衆帳號開發教程第6篇-文本消息的內容長度限制揭祕

相信不少朋友都遇到過這樣的問題:當發送的文本消息內容過長時,微信將不做任何響應。那麼到底微信允許的文本消息的最大長度是多少呢?我們又該如何計算文本的長度呢?爲什麼還有些人反應微信好像支持的文本消息最大長度在1300多呢?這篇文章會徹底解除大家的疑問。


接口文檔中對消息長度限制爲2048

以看到,接口文檔中寫的很明確:回覆的消息內容長度不超過2048字節。那爲什麼很多人測試反應消息內容長度在1300多字節時,微信就不響應了呢?我想這問題應該在這部分人沒有搞清楚到底該如何計算文本的字節數。


如何正確計算文本所佔字節數

計算文本(字符串)所佔字節數,大家第一個想到的應該就是String類的getBytes()方法,該方法返回的是字符串對應的字節數組,再計算數組的length就能夠得到字符串所佔字節數。例如:

  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編碼方式呢?我們再來看一個例子:

  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編碼方式時,一箇中文佔三個字節。


微信平臺採用的編碼方式及字符串所佔字節數的計算

那麼,在向微信服務器返回消息時,該採用什麼編碼方式呢?當然是UTF-8,因爲我們已經在doPost方法裏採用瞭如下代碼來避免中文亂碼了:

  1. // 將請求、響應的編碼均設置爲UTF-8(防止中文亂碼)  
  2. request.setCharacterEncoding("UTF-8");  
  3. response.setCharacterEncoding("UTF-8");  
爲了驗證我所說了,我寫了個例子來測試:

  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編碼方式時所佔字節數的計算方法封裝

  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這個數字,還應該對字符編碼方式有一個新的認識。


查看評論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章