如何将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 分享