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

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

go語言http請求:解決中文Unicode顯示問題

使用Go語言進行HTTP請求時,有時服務器返回的中文內容會以Unicode編碼顯示,例如“u5f20u4e09”代替“張三”。這是因為服務器返回的UTF-8編碼數據未被客戶端正確解碼。本文提供解決方案。

假設post函數已實現HTTP POST請求并返回響應內容。問題在于,post函數返回的content字符串包含Unicode編碼的中文。 我們需要將其轉換為可讀的中文字符。 直接使用golang.org/x/text/encoding/simplifiedchinese包進行UTF-8到GBK的轉換并不總是最佳方案,因為GBK并非所有字符都能覆蓋。 更穩妥的方法是直接使用UTF-8解碼。

以下代碼展示如何正確解碼UTF-8編碼的Unicode中文:

import (     "encoding/json"     "fmt"     "log" )  func convertUnicodeToChinese(unicodeString string) (string, error) {     var data interface{}     err := json.Unmarshal([]byte(unicodeString), &data) // 先將unicode字符串解析成JSON     if err != nil {         return "", fmt.Errorf("JSON unmarshal error: %w", err)     }      // 遞歸處理JSON數據結構,找到并轉換Unicode字符串     return convertUnicodeInJSON(data) }   func convertUnicodeInJSON(data interface{}) (string, error) {     switch v := data.(type) {     case string:         // 使用json.Unmarshal處理Unicode字符串         var decodedString string         err := json.Unmarshal([]byte(`"` + v + `"`), &decodedString)         if err != nil {             return "", fmt.Errorf("Unicode decoding error: %w", err)         }         return decodedString, nil     case map[string]interface{}:         result := make(map[string]interface{})         for k, val := range v {             convertedVal, err := convertUnicodeInJSON(val)             if err != nil {                 return "", err             }             result[k] = convertedVal         }         jsonString, err := json.Marshal(result)         if err != nil {             return "", fmt.Errorf("JSON marshal error: %w", err)         }         return string(jsonString), nil     case []interface{}:         var result []interface{}         for _, val := range v {             convertedVal, err := convertUnicodeInJSON(val)             if err != nil {                 return "", err             }             result = append(result, convertedVal)         }         jsonString, err := json.Marshal(result)         if err != nil {             return "", fmt.Errorf("JSON marshal error: %w", err)         }         return string(jsonString), nil     default:         return fmt.Sprintf("%v", data), nil     } }   func main() {     headers := map[string]string{         "user-agent": "test",     }     content, err := post("http://httpbin.org/post", headers, "")     if err != nil {         log.Fatal(err)     }     convertedContent, err := convertUnicodeToChinese(content)     if err != nil {         log.Fatal(err)     }     fmt.Println(convertedContent) } 

這段代碼首先嘗試將Unicode字符串解析為JSON,然后遞歸處理JSON結構中的所有值,使用json.Unmarshal對Unicode字符串進行解碼。 這比直接進行編碼轉換更可靠,因為它能處理更復雜的JSON結構,并且避免了編碼轉換可能造成的字符丟失或錯誤。 記得處理潛在的錯誤。 確保你的post函數也正確處理錯誤并返回。

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

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