Bagaimana untuk menukar pengekodan fail? Gunakan ioutil.ReadFile dan io.WriteString untuk membaca dan menulis fail, dengan menyatakan pengekodan baharu. Gunakan bufio.Reader dan bufio.Writer untuk membaca dan menulis fail baris demi baris dan mencipta objek dengan pengekodan yang berbeza. Gunakan fungsi OpenFile pustaka os untuk menentukan pengekodan semasa membuat atau membuka fail.
Amalan bahasa Go: ubah suai pengekodan fail
Dalam bahasa Go, pengekodan fail ialah spesifikasi untuk menentukan set aksaranya. Untuk bahasa dan senario yang berbeza, adalah penting untuk menggunakan pengekodan yang berbeza untuk memastikan paparan dan pemprosesan kandungan fail yang betul. Artikel ini akan memperkenalkan beberapa teknik pengubahsuaian pengekodan biasa dan menyediakan kes praktikal.
Kaedah 1: ioutil.ReadFile dan io.WriteString
Kaedah paling mudah ialah menggunakan ioutil.ReadFile
untuk membaca kandungan fail, dan kemudian gunakan io.WriteString
untuk menulis Import fail dan nyatakan pengekodan baharu. ioutil.ReadFile
读取文件内容,再使用 io.WriteString
写入文件,并指定新的编码。
package main import ( "fmt" "io/ioutil" "os" ) func main() { oldBytes, err := ioutil.ReadFile("test.txt") if err != nil { fmt.Println(err) return } newBytes := string(oldBytes) err = ioutil.WriteFile("test.txt", []byte(newBytes), 0666) if err != nil { fmt.Println(err) return } fmt.Println("File encoding changed successfully.") }
方法二:bufio.Reader 与 bufio.Writer
bufio.Reader
和 bufio.Writer
允许对文件进行逐行读取和写入。我们可以使用不同的编码创建这两个对象来读取和写入文件。
package main import ( "bufio" "errors" "fmt" "io" "os" ) func ReadFileWithEncoding(filePath string, encoding string) (string, error) { f, err := os.OpenFile(filePath, os.O_RDWR, 0666) if err != nil { return "", err } defer f.Close() dec := NewDecoder(f, encoding) content, err := dec.ReadString('\n') if err != nil { if err == io.EOF { return "", nil } return "", err } return content, nil } func NewDecoder(r io.Reader, enc string) (*Decoder, error) { switch enc { case "utf8": return &Decoder{reader: bufio.NewReader(r)}, nil case "utf16": return &Decoder{reader: bufio.NewReader(r), encoding: unicode.UTF16}, nil } return nil, errors.New("Unsupported encoding") } type Decoder struct { reader io.Reader encoding binary.ByteOrder } func (dec *Decoder) ReadString(delim byte) (string, error) { var buf bytes.Buffer found := false for { char, _, err := dec.reader.ReadRune() if err != nil { return "", err } if char == delim { found = true break } buf.WriteRune(char) } if !found { return "", io.EOF } return buf.String(), nil } func WriteFileWithEncoding(filePath string, content string, encoding string) error { f, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666) if err != nil { return err } defer f.Close() enc := NewEncoder(f, encoding) _, err = enc.WriteString(content) if err != nil { return err } return nil } func NewEncoder(w io.Writer, enc string) (*Encoder, error) { switch enc { case "utf8": return &Encoder{writer: bufio.NewWriter(w)}, nil case "utf16": return &Encoder{writer: bufio.NewWriter(w), encoding: unicode.UTF16}, nil } return nil, errors.New("Unsupported encoding") } type Encoder struct { writer io.Writer encoding binary.ByteOrder } func (enc *Encoder) WriteString(content string) (int, error) { size := len(content) for i := 0; i < size; { b := make([]byte, 2*len(content)) n := copy(b, content[i:]) if n == 0 { return 0, errors.New("Empty content") } i += n _, err := enc.writer.Write(b) if err != nil { return 0, err } } return size, nil } func main() { content, err := ReadFileWithEncoding("test.txt", "utf8") if err != nil { fmt.Println(err) return } err = WriteFileWithEncoding("test.txt", content, "utf16") if err != nil { fmt.Println(err) return } fmt.Println("File encoding changed successfully.") }
方法三:os 库
os
库提供了 OpenFile
package main import ( "fmt" "os" ) func main() { f, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 0666) if err != nil { fmt.Println(err) return } _, err = f.WriteString("Hello, world!") if err != nil { fmt.Println(err) return } err = f.Close() if err != nil { fmt.Println(err) return } fmt.Println("File encoding changed successfully.") }
Kaedah 2: bufio.Reader dan bufio.Writer
bufio.Reader
dan bufio.Writer
membenarkan pembacaan dan penulisan fail baris demi baris. Kita boleh mencipta dua objek ini menggunakan pengekodan yang berbeza untuk membaca dan menulis fail. os
Pustaka menyediakan fungsi OpenFile
, yang membolehkan kami menentukan pengekodan semasa mencipta atau membuka fail. 🎜rrreee🎜🎜Nota: 🎜🎜🎜🎜Apabila mengubah suai pengekodan fail, pastikan pengekodan baharu serasi dengan kandungan fail. 🎜🎜Sila ambil perhatian bahawa beberapa set aksara (seperti ASCII) boleh diwakili oleh berbilang pengekodan, jadi mungkin terdapat perbezaan yang ketara semasa mengubah suai pengekodan. 🎜🎜Atas ialah kandungan terperinci Berkongsi petua untuk melaksanakan pengubahsuaian pengekodan fail di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!