摘要:記一次字符串壓縮操作項目中遇到一個場景需要將一批數(shù)據(jù)發(fā)送到端,且實(shí)際應(yīng)用場景中,對數(shù)據(jù)的長度有一定的限制,于是就需要用到字符串壓縮。端使用,后端使用,使用壓縮,同時涉及到了編碼,中文和西歐字符集轉(zhuǎn)碼。
記一次字符串壓縮操作
項目中遇到一個場景:需要將一批數(shù)據(jù)發(fā)送到APP端,且實(shí)際應(yīng)用場景中,對數(shù)據(jù)的長度有一定的限制,于是就需要用到字符串壓縮。
APP端使用Java,后端使用Golang,使用gzip壓縮,同時涉及到了base64編碼,中文和西歐字符集轉(zhuǎn)碼。
后端:
字符集轉(zhuǎn)換 參考自:一個復(fù)雜的中文編碼問題
壓縮字符串
使用base64編碼為可見字符
網(wǎng)絡(luò)傳輸
APP端
接收網(wǎng)絡(luò)響應(yīng)
base64解碼,得到一個字節(jié)數(shù)組(壓縮的)
gzip讀取壓縮的字節(jié)流,解壓縮
轉(zhuǎn)碼為中文
示例代碼所有示例代碼可以在這里找到
server端
func compress(s string) string { //使用GBK字符集encode gbk, err := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(s)) if err != nil { logrus.Error(err) return "" } //轉(zhuǎn)為ISO8859_1,也就是latin1字符集 latin1, err := charmap.ISO8859_1.NewDecoder().Bytes(gbk) if err != nil { return "" } //使用gzip壓縮 var buf bytes.Buffer zw := gzip.NewWriter(&buf) _, err = zw.Write(latin1) if err != nil { logrus.Fatal(err) } if err := zw.Close(); err != nil { logrus.Fatal(err) } //使用base64編碼 encoded := base64.StdEncoding.EncodeToString(buf.Bytes()) fmt.Println(encoded) return encoded }
APP端
private static String uncompress(String s) throws IOException { //base64 decode byte[] byteArray = Base64.getDecoder().decode(s); ByteArrayInputStream bis = new ByteArrayInputStream(byteArray); //gzip解壓 GZIPInputStream gis = new GZIPInputStream(bis); BufferedReader br = new BufferedReader(new InputStreamReader(gis, "UTF-8")); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } br.close(); gis.close(); bis.close(); //使用latin1字符集獲得bytes byte[] latin1 = sb.toString().getBytes("ISO_8859_1"); //轉(zhuǎn)換回GBK return new String(latin1, "GBK"); }
使用base64編碼,主要是因為經(jīng)過gzip壓縮后數(shù)據(jù),直接轉(zhuǎn)成字符串的話,會有很多不可見字符,這樣在傳輸過程中,通常會被服務(wù)端框架轉(zhuǎn)義,從而失真。
代碼僅作為示例使用,實(shí)際業(yè)務(wù)編碼請注意檢查錯誤和異常等。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72439.html
摘要:除非使用了分塊編碼,否則首部就是帶有實(shí)體主體的報文必須使用的。 背景 新項目上線, 發(fā)現(xiàn)一個奇怪的BUG, 請求接口有很小的概率返回400 Bad Request,拿到日志記錄的請求的參數(shù)于POSTMAN中測試請求接口, 發(fā)現(xiàn)能夠正常響應(yīng). 排查過程 首先服務(wù)器能夠正常響應(yīng)400 Bad Request, 排除接口故障問題. 對比日志過程中發(fā)現(xiàn) { hello:world ...
摘要:記一次打包前言公司的一個公眾號要做一個的活動很簡單的兩個頁面寫完之后我想要不要去做一下壓縮還是直接放上去就好了后面一想還是做下壓縮吧正好重新學(xué)習(xí)下以前用都是人家寫好的手腳架拿來直接用的自己改改沒啥問題但是要自己重新搭一套好像也不太會所以趁這 記一次webpack打包 前言 公司的一個公眾號要做一個H5的活動. 很簡單的兩個頁面, 寫完之后, 我想要不要去做一下壓縮, 還是直接放上去...
摘要:釘釘新需求溝通后了解到,是一個臨時需求。開始部署環(huán)境一個項目開發(fā)的前提是什么是正常運(yùn)行并開啟調(diào)試模式。及時復(fù)盤項目的開發(fā)流程,記錄開發(fā)計劃中遇到的協(xié)作問題和技術(shù)問題。 ? 釘釘新需求 溝通后了解到,是一個臨時需求。 在一個老項目上。 具體有多老,直到開發(fā)完也不知道。 showImg(https://segmentfault.com/img/remote/1460000019364396...
摘要:釘釘新需求溝通后了解到,是一個臨時需求。開始部署環(huán)境一個項目開發(fā)的前提是什么是正常運(yùn)行并開啟調(diào)試模式。及時復(fù)盤項目的開發(fā)流程,記錄開發(fā)計劃中遇到的協(xié)作問題和技術(shù)問題。 ? 釘釘新需求 溝通后了解到,是一個臨時需求。 在一個老項目上。 具體有多老,直到開發(fā)完也不知道。 showImg(https://segmentfault.com/img/remote/1460000019364396...
閱讀 3577·2021-11-25 09:43
閱讀 1384·2021-09-08 09:45
閱讀 2715·2021-09-07 09:59
閱讀 1564·2021-08-09 13:45
閱讀 3514·2019-08-30 15:54
閱讀 754·2019-08-29 18:35
閱讀 572·2019-08-29 17:18
閱讀 1121·2019-08-29 14:10