Golang默認使用UTF-8編碼,而Ubuntu系統及終端的默認編碼可能為GBK或其他格式,編碼不匹配是導致亂碼的核心原因。以下是針對性解決步驟:
Ubuntu終端的默認編碼可能為GBK(尤其是較舊版本),需修改為UTF-8:
chcp 65001
(需Ubuntu 18.04及以上版本支持),將當前終端會話的編碼切換為UTF-8。~/.bashrc
或~/.zshrc
),添加export LANG=en_US.UTF-8
和export LC_ALL=en_US.UTF-8
,然后執行source ~/.bashrc
使配置生效。// +build !release
package main
此注釋不會影響編譯,但部分編輯器會根據注釋自動識別編碼。若程序需讀取或寫入非UTF-8編碼的文件(如GBK格式),需使用golang.org/x/text/encoding
包進行轉換:
package main
import (
"bufio"
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"os"
)
func main() {
file, _ := os.Open("gbk_file.txt")
defer file.Close()
reader := bufio.NewReader(transform.NewReader(file, simplifiedchinese.GBK.NewDecoder())) // 轉換為UTF-8
for {
line, _, err := reader.ReadLine()
if err != nil { break }
fmt.Println(string(line))
}
}
package main
import (
"bufio"
"os"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
)
func main() {
file, _ := os.Create("output_gbk.txt")
defer file.Close()
writer := bufio.NewWriter(transform.NewWriter(file, simplifiedchinese.GBK.NewEncoder())) // 轉換為GBK
writer.WriteString("你好,世界!")
writer.Flush()
}
通過transform.NewReader
或transform.NewWriter
實現編碼轉換,確保文件內容與程序編碼一致。若程序為Web應用,需在HTTP響應頭中明確指定字符集為UTF-8,避免瀏覽器解析錯誤:
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8") // 關鍵設置
w.Write([]byte("中文內容"))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
此設置確保瀏覽器以UTF-8編碼渲染頁面,避免中文亂碼。
舊版本Golang可能存在編碼處理bug,建議升級至最新穩定版(如1.21+):
sudo apt update
sudo apt install golang-go # 或使用官方二進制文件安裝
go version # 確認版本
升級后重新編譯程序,檢查亂碼問題是否解決。
通過以上步驟,可覆蓋Golang在Ubuntu上編譯/運行亂碼的常見場景。核心邏輯是統一編碼為UTF-8,并通過工具或配置處理外部數據的編碼轉換。