相信不少朋友都遇到過這樣的問題:當發送的文本消息內容過長時,微信將不做任何響應。那麼到底微信允許的文本消息的最大長度是多少呢?我們又該如何計算文本的長度呢?為什麼還有些人反應微信好像支持的文本消息最大長度在1300多呢?這篇文章會徹底解除大家的疑問。
接口文檔中對消息長度限制為2048
可以看到,接口文檔中寫的很明確:回復的消息內容長度不超過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; }
好了,本章節的內容就講到這裡,我想大家通過這篇文章所學到的應該不僅僅是2047這個數字,還應該對字符編碼方式有一個新的認識。