?最近自己在開發(fā)微信訂閱號(hào),其中的一個(gè)功能是圖片文字識(shí)別。但是微信對(duì)返回的文字長(zhǎng)度是有限制的啦桌。新的微信開發(fā)文檔里我沒(méi)有找到長(zhǎng)度限制是多少,但是在以前的文檔里面規(guī)定的是長(zhǎng)度不超過(guò)2048字節(jié),注意是字節(jié)甫男,如果長(zhǎng)度超限且改,而后端有沒(méi)有做相應(yīng)處理,也沒(méi)有返回“success”字符串板驳,那么微信就會(huì)對(duì)用戶的請(qǐng)求響應(yīng)一個(gè)該公眾號(hào)暫時(shí)不能提供服務(wù)又跛。
? Java中使用String的getBytes().length
可以方便地計(jì)算字符串所占字節(jié)數(shù)。
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println("英俊\n23d".getBytes("ISO8859-1").length);//6
System.out.println("英俊\n23d".getBytes("GB2312").length);//8
System.out.println("英俊\n23d".getBytes("GBK").length);//8
System.out.println("英俊\n23d".getBytes("UTF-8").length);//10
System.out.println("英俊\n23d".getBytes().length);//10
}
?從上面的輸出可以看出采用ISO8859-1編碼方式時(shí)若治,一個(gè)中/英文都只占一個(gè)字節(jié)慨蓝;采用GB2312或GBK編碼方式時(shí),一個(gè)中文占兩個(gè)字節(jié)端幼;而采用UTF-8編碼方式時(shí)礼烈,一個(gè)中文占三個(gè)字節(jié)。而當(dāng)不指定編碼時(shí)婆跑,采用的就是操作系統(tǒng)的默認(rèn)編碼方式此熬,我的系統(tǒng)默認(rèn)編碼方式就是UTF-8。
?在向微信服務(wù)器返回消息時(shí)滑进,采用了UTF-8犀忱,因?yàn)槲覍⒄?qǐng)求和回復(fù)的編碼都設(shè)置成UTF-8防止亂碼,采用UTF-8編碼時(shí)扶关,文本消息內(nèi)容最多支持2047個(gè)字節(jié)峡碉,多一個(gè)都不給響應(yīng)。其實(shí)問(wèn)題并不在這里驮审,既然微信有文本消息長(zhǎng)度限制鲫寄,那么我識(shí)別出來(lái)的文字很長(zhǎng)怎么辦,我該怎么返回給用戶呢疯淫?我想到的解決方案是如果長(zhǎng)度超過(guò)2047個(gè)字節(jié)地来,那么我就將文字內(nèi)容寫入一個(gè)txt文件然后上傳到七牛云,用七牛云做對(duì)象存儲(chǔ)熙掺,上傳成功返回該txt文件的鏈接未斑,再刪除本地的txt,最后返回部分文字內(nèi)容和七牛云的鏈接給微信服務(wù)器币绩。
?愿景很美好蜡秽,也成功返回了,可是自己測(cè)試時(shí)發(fā)現(xiàn)缆镣,在微信端打開鏈接顯示的文字總是亂碼芽突,而且在Chrome亂碼在360極速瀏覽器又是好的,這就跟瀏覽器默認(rèn)的編碼方式有很大關(guān)系董瞻。我一開始以為跟微信那邊的文字編碼有關(guān)系寞蚌,然后試了將文本內(nèi)容的寫入用UTF-8田巴、ISO8859-1,結(jié)果都不行挟秤,真是令人頭疼壹哺。后來(lái)我仔細(xì)想了想,微信打開鏈接艘刚,應(yīng)該使用了微信的內(nèi)置瀏覽器管宵,然后在鏈接頁(yè)面往下拉,就會(huì)發(fā)現(xiàn)有段文字說(shuō)明攀甚,大概意思是QQ瀏覽器X5內(nèi)核提供支持箩朴。OK,QQ瀏覽器云稚,無(wú)奈手機(jī)上下了個(gè)QQ瀏覽器隧饼,然后試了試用QQ瀏覽器打開以GB2312編碼的文本,我丟静陈,竟然正常顯示...看來(lái)坑就在這里燕雁。果然,改成GB2312編碼后一切就正常了鲸拥。好吧拐格,QQ瀏覽器,世界清靜了刑赶。