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,并通过工具或配置处理外部数据的编码转换。