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