go語言http請求:正確顯示中文字符
在使用Go語言處理HTTP請求時,經常遇到響應內容中包含Unicode編碼的中文字符,導致顯示為亂碼。本文將提供解決方案,實現Unicode到可讀中文的轉換。
問題:Unicode編碼中文顯示為亂碼
Go語言HTTP請求的響應內容中,中文字符可能以Unicode編碼形式出現(例如u5f20u4e09而不是“張三”)。
解決方案:Unicode到GBK編碼轉換
立即學習“go語言免費學習筆記(深入)”;
為了解決這個問題,我們需要將Unicode編碼的字符串轉換為GBK編碼。 這需要用到golang.org/x/text/encoding/simplifiedchinese包。
首先,需要引入必要的包:
import ( "bytes" "fmt" "io" "net/http" "net/url" "golang.org/x/text/encoding/simplifiedchinese" )
然后,添加一個轉換函數:
func convertUnicodeToGBK(str String) (string, error) { utf8Bytes, err := simplifiedchinese.UTF8.NewDecoder().Bytes([]byte(str)) if err != nil { return "", fmt.Errorf("unicode to utf8 decode error: %w", err) } gbkBytes, err := simplifiedchinese.GBK.NewEncoder().Bytes(utf8Bytes) if err != nil { return "", fmt.Errorf("utf8 to gbk encode error: %w", err) } return string(gbkBytes), nil }
這個函數首先將Unicode字符串解碼為UTF-8,然后將UTF-8編碼的字節數組編碼為GBK。 錯誤處理更加完善,返回了具體的錯誤信息。
最后,在main函數或其他處理響應內容的地方調用該函數:
func main() { // ... (之前的代碼保持不變) ... 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 } convertedContent, err := convertUnicodeToGBK(string(body)) if err != nil { fmt.Printf("Conversion error: %vn", err) return "", err } fmt.Println(convertedContent) // ... (后續代碼保持不變) ... }
通過convertUnicodeToGBK函數,將HTTP響應體內容轉換為GBK編碼,從而正確顯示中文字符。 注意添加了defer resp.Body.Close()來確保正確關閉響應體,避免資源泄漏。 并且對錯誤進行了更細致的處理。 這個改進后的方案更健壯,更易于調試和維護。
這個完整的解決方案避免了直接使用string(body)帶來的潛在編碼問題,并提供了更清晰的錯誤處理機制。 記住在使用前安裝golang.org/x/text包:go get golang.org/x/text/encoding/simplifiedchinese