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