package main
import (
"bufio"
"fmt"
"github.com/axgle/mahonia"
"io"
"log"
"os"
)
func main() {
filename := "/tmp/test.txt"
readTbkByLine(filename)
}
// 本方法安全可用
func readTbkByLine(filename string) {
FileHandle, err := os.Open(filename)
if err != nil {
log.Println(err)
return
}
defer FileHandle.Close()
// 指定gbk解码
decoder := mahonia.NewDecoder("gbk")
buf := bufio.NewReader(decoder.NewReader(FileHandle))
for {
// ReadBytes 方法安全可用,以换行符作为读取文件的截止符,经过多次测试GBK文件没有乱码
line, e := buf.ReadBytes('\n')
if e != nil {
panic(e)
}
// 结束
if e == io.EOF {
break
}
fmt.Println(string(line))
}
}
// readGbk 本方法仅仅做对照,因为ReadLine方法在有些测试文件有问题
func readGbk(filename string) {
f, err := os.Open(filename)
if err != nil {
fmt.Println("文件不存在:", filename)
return
}
decoder := mahonia.NewDecoder("gbk") // 把原来ANSI格式的文本文件里的字符,用gbk进行解码。
buf := bufio.NewReader(decoder.NewReader(f))
for {
// 按照ReadLine读取行有些测试的GBK文件文件
l, _, e := buf.ReadLine()
if e == io.EOF {
break
}
fmt.Println(string(l))
}
}
// 覆盖写入GBK
func writeGbkFile(filename string) {
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
writer := bufio.NewWriter(file)
enc := mahonia.NewEncoder("gbk")
writer.WriteString(enc.ConvertString("这是测试的第一行" + "\n"))
writer.WriteString(enc.ConvertString("这是测试的第二行" + "\n"))
writer.WriteString(enc.ConvertString("这是测试的第三行" + "\n"))
writer.Flush()
}