摘要:記一次字符串壓縮操作項目中遇到一個場景需要將一批數據發送到端,且實際應用場景中,對數據的長度有一定的限制,于是就需要用到字符串壓縮。端使用,后端使用,使用壓縮,同時涉及到了編碼,中文和西歐字符集轉碼。
記一次字符串壓縮操作
項目中遇到一個場景:需要將一批數據發送到APP端,且實際應用場景中,對數據的長度有一定的限制,于是就需要用到字符串壓縮。
APP端使用Java,后端使用Golang,使用gzip壓縮,同時涉及到了base64編碼,中文和西歐字符集轉碼。
后端:
字符集轉換 參考自:一個復雜的中文編碼問題
壓縮字符串
使用base64編碼為可見字符
網絡傳輸
APP端
接收網絡響應
base64解碼,得到一個字節數組(壓縮的)
gzip讀取壓縮的字節流,解壓縮
轉碼為中文
示例代碼所有示例代碼可以在這里找到
server端
func compress(s string) string { //使用GBK字符集encode gbk, err := simplifiedchinese.GBK.NewEncoder().Bytes([]byte(s)) if err != nil { logrus.Error(err) return "" } //轉為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"); //轉換回GBK return new String(latin1, "GBK"); }
使用base64編碼,主要是因為經過gzip壓縮后數據,直接轉成字符串的話,會有很多不可見字符,這樣在傳輸過程中,通常會被服務端框架轉義,從而失真。
代碼僅作為示例使用,實際業務編碼請注意檢查錯誤和異常等。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72439.html
摘要:除非使用了分塊編碼,否則首部就是帶有實體主體的報文必須使用的。 背景 新項目上線, 發現一個奇怪的BUG, 請求接口有很小的概率返回400 Bad Request,拿到日志記錄的請求的參數于POSTMAN中測試請求接口, 發現能夠正常響應. 排查過程 首先服務器能夠正常響應400 Bad Request, 排除接口故障問題. 對比日志過程中發現 { hello:world ...
摘要:記一次打包前言公司的一個公眾號要做一個的活動很簡單的兩個頁面寫完之后我想要不要去做一下壓縮還是直接放上去就好了后面一想還是做下壓縮吧正好重新學習下以前用都是人家寫好的手腳架拿來直接用的自己改改沒啥問題但是要自己重新搭一套好像也不太會所以趁這 記一次webpack打包 前言 公司的一個公眾號要做一個H5的活動. 很簡單的兩個頁面, 寫完之后, 我想要不要去做一下壓縮, 還是直接放上去...
摘要:釘釘新需求溝通后了解到,是一個臨時需求。開始部署環境一個項目開發的前提是什么是正常運行并開啟調試模式。及時復盤項目的開發流程,記錄開發計劃中遇到的協作問題和技術問題。 ? 釘釘新需求 溝通后了解到,是一個臨時需求。 在一個老項目上。 具體有多老,直到開發完也不知道。 showImg(https://segmentfault.com/img/remote/1460000019364396...
摘要:釘釘新需求溝通后了解到,是一個臨時需求。開始部署環境一個項目開發的前提是什么是正常運行并開啟調試模式。及時復盤項目的開發流程,記錄開發計劃中遇到的協作問題和技術問題。 ? 釘釘新需求 溝通后了解到,是一個臨時需求。 在一個老項目上。 具體有多老,直到開發完也不知道。 showImg(https://segmentfault.com/img/remote/1460000019364396...
閱讀 3510·2021-11-25 09:43
閱讀 1266·2021-09-08 09:45
閱讀 2643·2021-09-07 09:59
閱讀 1502·2021-08-09 13:45
閱讀 3339·2019-08-30 15:54
閱讀 696·2019-08-29 18:35
閱讀 513·2019-08-29 17:18
閱讀 992·2019-08-29 14:10