天天看點

[030] 微信公衆帳号開發教程第6篇-文本消息的内容長度限制揭秘(轉)

相信不少朋友都遇到過這種問題:當發送的文本消息内容過長時,微信将不做不論什麼響應。那麼究竟微信同意的文本消息的最大長度是多少呢?我們又該怎樣計算文本的長度呢?為什麼還有些人反應微信好像支援的文本消息最大長度在1300多呢?這篇文章會徹底解除大家的疑問。

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

[030] 微信公衆帳号開發教程第6篇-文本消息的内容長度限制揭秘(轉)

可以看到,接口文檔中寫的非常明白:回複的消息内容長度不超過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);  

    System.out.println("柳峰".getBytes("GB2312").length);  

    System.out.println("柳峰".getBytes("GBK").length);  

    // 執行結果:6  

    System.out.println("柳峰".getBytes("UTF-8").length);  

這個樣例是不是非常好地證明了我上面給出的三條結論呢?也就是說採用ISO8859-1編碼方式時,一個中/英文都僅僅占一個位元組;採用GB2312或GBK編碼方式時,一個中文占兩個位元組;而採用UTF-8編碼方式時,一個中文占三個位元組。

微信平台採用的編碼方式及字元串所占位元組數的計算

那麼,在向微信server傳回消息時,該採用什麼編碼方式呢?當然是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("不知道什麼時候開始喜歡這裡每一個夜裡都會來這裡看你你長得多麼漂亮叫我不能不看你看不到你我就迷失了自己好想牽!");  

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