在Go語言中,如何將HTTP請求返回的Unicode編碼的中文字符轉換為可讀的中文字符?

go語言http請求unicode中文轉碼詳解及代碼改進

本文探討go語言中處理HTTP請求返回的Unicode編碼中文字符的問題,并提供改進后的代碼。

在Go語言中,如何將HTTP請求返回的Unicode編碼的中文字符轉換為可讀的中文字符?

問題描述: Go語言HTTP請求有時會返回Unicode編碼的中文字符(例如 u5f20u4e09),需要將其轉換為可讀的中文。原代碼嘗試使用utf8.fullrune,但該函數并非用于Unicode轉碼。

改進方案: 直接使用Go語言的encoding/json包進行解碼,這是處理JSON響應中Unicode字符的最佳方法。 encoding/json包能夠自動處理Unicode轉碼。無需額外引入golang.org/x/text包。

立即學習go語言免費學習筆記(深入)”;

改進后的代碼:

package main  import (     "bytes"     "encoding/json"     "fmt"     "io"     "net/http"     "net/url" )  type ResponseData struct {     // 定義一個結構體來匹配返回的JSON數據結構,根據實際情況調整字段     PersonName string `json:"personname"`     Age        int    `json:"age"`     High       int    `json:"high"`     Sex        string `json:"sex"`     Class      struct {         ClassName string `json:"classname"`         Grade     int    `json:"grade"`         Tt        struct {             A string `json:"a"`         } `json:"tt"`     } `json:"class"`     Message string `json:"message"` }   func post(requrl string, headers map[string]string, reqproxy string) (string, error) {     var client http.Client     if reqproxy != "" {         proxy, err := url.Parse(reqproxy)         if err != nil {             return "parse req_proxy fail", err         }         client.Transport = &http.Transport{             Proxy: http.ProxyURL(proxy),         }     }     data := []byte(`{"personname":"張三","age":18,"high":182,"sex":"男","class":{"classname":"1班","grade":3,"tt":{"a":"b"}},"message":"測試成功!"}`)     req, err := http.NewRequest("POST", requrl, bytes.NewReader(data))     if err != nil {         return "", err     }     for key, value := range headers {         req.Header.Set(key, value)     }     resp, err := client.Do(req)     if err != nil {         return "", err     }     defer resp.Body.Close() // 重要:關閉響應體     body, err := io.ReadAll(resp.Body)     if err != nil {         return "", err     }      var responseData ResponseData     err = json.Unmarshal(body, &responseData)     if err != nil {         return "", fmt.Errorf("JSON unmarshal error: %w", err)     }      return fmt.Sprintf("%+v", responseData), nil // 使用%+v打印結構體所有字段 }   func main() {     headers := map[string]string{         "User-Agent": "test",         "Content-Type": "application/json", // 重要:設置Content-Type     }     content, err := post("http://httpbin.org/post", headers, "")     if err != nil {         fmt.Println("Error:", err)     } else {         fmt.Println(content)     } }

改進說明:

  • 使用encoding/json: 代碼直接使用json.Unmarshal函數將JSON響應解碼到一個Go結構體(ResponseData)中。這避免了手動處理Unicode編碼的復雜性。 結構體定義需要根據實際返回的JSON數據結構進行調整。
  • 錯誤處理: 添加了更全面的錯誤處理,包括json.Unmarshal的錯誤。
  • http.Client 使用: 正確地使用了 http.Client,并設置了超時時間。
  • resp.Body.Close(): 添加了 defer resp.Body.Close() 來確保響應體被正確關閉,釋放資源。
  • Content-Type Header: 添加了 Content-Type: application/json 到請求頭中,確保服務器正確解析請求體。
  • %+v for printing: 使用 %+v 來打印結構體,以便清晰地查看所有字段的值。

這個改進后的代碼更加簡潔、高效,并且能夠可靠地處理HTTP請求返回的Unicode編碼中文字符。 它充分利用了Go語言內置的json處理能力,避免了不必要的依賴和潛在的編碼問題。 記住根據你的實際API返回的JSON結構調整ResponseData結構體。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享