眾多開發者遇到過文本消息過長導致微信無響應的問題。官方文檔標明「回復消息內容長度不超過 2048 字節」,但實測卻常在 1300 字節左右失效。本文徹底揭秘字節計算陷阱與編碼差異。
官方明確限制 2048 字節,為何實測卻只有 1300 多?關鍵在於 字符編碼方式不同導致字節數差異巨大。
同一字符串「柳峰」在不同編碼下的字節長度:
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println("柳峰".getBytes("ISO8859-1").length); // 2
System.out.println("柳峰".getBytes("GB2312").length); // 4
System.out.println("柳峰".getBytes("GBK").length); // 4
System.out.println("柳峰".getBytes("UTF-8").length); // 6
}
doPost 中已設置編碼:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
因此計算字節數必須指定 UTF-8,否則 String.getBytes() 會使用系統預設編碼(通常為 GBK),導致誤判。
private static String getMsgContent() {
StringBuffer buffer = new StringBuffer();
// 構造 682 個漢字 + 1 個英文符號
for (int i = 0; i < 10; i++) {
buffer.append("不知道什麼時候開始喜歡這裡每個夜裡都會來這裡看你你長得多麼美麗叫我不能不看你看不到你我就迷失了自己好想牽你的手走過風風雨雨有什麼困難我都陪你");
}
buffer.append("!");
return buffer.toString();
}
public static void main(String[] args) throws Exception {
System.out.println(getMsgContent().getBytes("gb2312").length); // 1365 字節
System.out.println(getMsgContent().getBytes("utf-8").length); // 2047 字節
}
結論:UTF-8 編碼下最大 2047 字節(等於 2048 也會失敗),GBK 下僅 1365 字節。這就是「1300 字節說」的由來——開發者未指定編碼直接用 getBytes() 計算。
/** 計算 UTF-8 編碼下字符串字節數 */
public static int getByteSize(String content) {
if (content == null) return 0;
try {
return content.getBytes("utf-8").length;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return 0;
}
}
掌握編碼與字節計算的正確姿勢,不再為長度限制踩坑。下一篇將講解文本消息中換行符的優雅使用。