Dalam pembangunan golang, jika pengekodan output tidak ditetapkan, masalah aksara Cina bercelaru mungkin berlaku. Di bawah, saya akan memperkenalkan cara menyelesaikan masalah golang mengeluarkan aksara Cina yang kacau-bilau dari dua aspek: prinsip pengekodan output dan menetapkan pengekodan output.
1. Prinsip pengekodan output
Dalam golang, semua rentetan disimpan dalam pengekodan UTF-8, termasuk aksara Cina. UTF-8 ialah pengekodan Unicode panjang boleh ubah yang boleh mewakili sebarang aksara dalam standard Unicode. Oleh itu, aksara Cina yang kami gunakan dalam program golang sebenarnya disimpan dalam ingatan dalam bentuk pengekodan UTF-8.
Apabila kita perlu mengeluarkan atur cara yang ditulis dalam golang ke terminal, fail, halaman web atau peranti output lain, kita perlu menukar pengekodan UTF-8 kepada pengekodan sasaran. Biasanya, terminal atau peranti output fail akan menggunakan pengekodan tempatan secara lalai untuk teks output. Sebagai contoh, sistem pengendalian Windows menggunakan pengekodan GBK secara lalai, dan sistem pengendalian Linux menggunakan pengekodan UTF-8 secara lalai.
Jika pengekodan UTF-8 program golang tidak ditukar dengan betul semasa output, aksara Cina bercelaru mungkin muncul. Ini kerana pengekodan sasaran tidak dapat mengecam aksara Cina dengan betul dalam pengekodan UTF-8, menyebabkan teks output tidak dipaparkan dengan betul.
Oleh itu, untuk menyelesaikan masalah golang mengeluarkan aksara Cina bercelaru, kita perlu menetapkan pengekodan output untuk membolehkan pengekodan sasaran mengenali aksara Cina yang dikodkan UTF-8 dengan betul.
2. Tetapkan pengekodan output
Dalam golang, kaedah menetapkan pengekodan output berbeza-beza bergantung pada peranti output. Di bawah, kami memperkenalkan cara untuk menetapkan pengekodan output terminal, fail dan halaman web masing-masing.
Dalam golang, gunakan kaedah Println bagi pakej fmt untuk mengeluarkan rentetan ke terminal. Jika anda perlu menetapkan pengekodan output terminal, kami boleh menggunakan kaedah Fprintln bagi atribut os.Stdout dan menetapkan parameter pemformatan.
Sebagai contoh, di bawah sistem Windows, tetapkan pengekodan output terminal kepada kod GBK seperti berikut:
package main import ( "fmt" "os" ) func main() { stdout := os.Stdout fmt.Println("Hello 世界!") }
Kemudian, gunakan kaedah Println bagi pakej fmt untuk mengeluarkan rentetan Cina yang dikodkan UTF-8 "Hello Dunia!".
Jalankan kod di atas, output terminal hendaklah:
123 Hello 世界!
Dalam golang, gunakan kaedah Cipta pakej os Cipta fail dan gunakan kaedah NewWriter bagi pakej bufio untuk mencipta penulis fail buffer untuk menetapkan pengekodan fail output.
Sebagai contoh, di bawah sistem Windows, kod untuk menetapkan pengekodan fail output kepada GBK adalah seperti berikut:
package main import ( "bufio" "os" ) func main() { file, err := os.Create("output.txt") if err != nil { panic(err) } defer file.Close() writer := bufio.NewWriter(file) writer.WriteString("Hello 世界!") writer.Flush() }
Dalam kod di atas, kami mula-mula mencipta fail output output.txt menggunakan Cipta kaedah pakej os dan gunakan pernyataan tangguh untuk menangguhkan penutupan pemegang fail.
Jalankan kod di atas dan lihat kandungan fail output.txt Ia sepatutnya:
123 Hello 世界!
. Dalam golang, gunakan net Antara muka penulis pakej /http melaksanakan kaedah Tulis kelas ResponseWriter untuk mengeluarkan respons HTTP.
Jika anda perlu menetapkan pengekodan output halaman web, kami perlu menetapkan atribut Jenis Kandungan pengepala respons HTTP dahulu, dan kemudian gunakan kaedah Tulis untuk mengeluarkan teks yang dikodkan UTF-8.
Sebagai contoh, di bawah sistem Windows, kod untuk menetapkan pengekodan output halaman web kepada GBK adalah seperti berikut:
package main import ( "io" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=gbk") io.WriteString(w, "<html><head><meta charset='gbk'></head><body>Hello 世界!</body></html>") }) http.ListenAndServe(":8080", nil) }
Dalam kod di atas, kami mula-mula menggunakan kaedah HandleFunc net/ Pakej http untuk mendaftarkan fungsi pemprosesan permintaan HTTP. Apabila mengakses laluan akar, tetapkan atribut Jenis Kandungan pengepala respons HTTP kepada "text/html; charset=gbk", dan kemudian gunakan kaedah WriteString bagi pakej io untuk mengeluarkan teks HTML "< head>
Hello world