相信不少朋友都遇到過這樣的問題:當發送的簡訊內容過長時,將不做任何響應。那麼到底允許的簡訊的最大長度是多少呢?我們又該如何計算文本的長度呢?為什麼還有些人反應好像支援的簡訊最大長度在1300多呢?這篇文章會徹底解除大家的疑問。
介面文檔中對訊息長度限制為2048
可以看到,介面文檔中寫的很明確:回複的訊息內容長度不超過2048位元組。那為什麼很多人測試反應訊息內容長度在1300多位元組時,就不響應了呢?我想這問題應該在這部分人沒有搞清楚到底該如何計算文本的位元組數。
如何正確計算文本所佔位元組數
計算文本(字串)所佔位元組數,大家第一個想到的應該就是String類的getBytes()方法,該方法返回的是字串對應的位元組數組,再計算數組的length就能夠得到字串所佔位元組數。例如:
public static void main(String []args) {// 運行結果:4System.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 {// 運行結果:2System.out.println("柳峰".getBytes("ISO8859-1").length);// 運行結果:4System.out.println("柳峰".getBytes("GB2312").length);// 運行結果:4System.out.println("柳峰".getBytes("GBK").length);// 運行結果:6System.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這個數字,還應該對字元編碼方式有一個新的認識。
http://www.bkjia.com/PHPjc/444571.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/444571.htmlTechArticle相信不少朋友都遇到過這樣的問題:當發送的簡訊內容過長時,將不做任何響應。那麼到底允許的簡訊的最大長度是多少...