我正在尝试读取包含如下名称的纯文本文件:"CASTAÑEDA"
代码基本上是这样的:
file, err := os.Open("C:/Files/file.txt")
defer file.Close()
if err != nil {
log.Fatal(err)
}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
Run Code Online (Sandbox Code Playgroud)
然后,当读取"CASTAÑEDA"时,它会打印"CASTA EDA"
用bufio阅读时有什么方法可以处理这些字符吗?
谢谢.
您遇到的问题是您的输入可能不是UTF-8(这是bufio和大多数Go语言/ stdlib所期望的)。取而代之的是,您的输入可能使用了一些扩展的ASCII码页,这就是为什么未加重音符的字符会整洁地传递(UTF-8也是7位ASCII的超集),但不会原封不动地传递'Ñ'的原因。
在这种情况下,带重音字符的位表示形式不是有效的UTF-8,因此将生成Unicode替换字符(U + FFFD)。您有几种选择:
os.Stdout.Write(scanner.Bytes()); fmt.Println();这样可以避免将字节解释为换行符之后的UTF-8。直接os.Stdout将字节写入会进一步避免对内容的任何(错误)解释。您的文件最可能是非UTF-8.因此(go期望所有字符串都是UTF-8),你的控制台输出看起来很糟糕.我建议使用包golang.org/x/text/encoding/charmap,golang.org/x/text/transform在你的情况下,将文件的数据转换为UTF-8.正如我可能认为的那样,查看文件路径,您就在Windows上.所以您的字符编码可能是Windows1252(如果您使用notepad.exe编辑了它).
尝试这样的事情:
package main
import (
"bufio"
"fmt"
"log"
"os"
"golang.org/x/text/encoding/charmap"
"golang.org/x/text/transform"
)
func main() {
file, err := os.Open("C:/temp/file.txt")
defer file.Close()
if err != nil {
log.Fatal(err)
}
dec := transform.NewReader(file, charmap.Windows1252.NewDecoder()) <- insert your enconding here
scanner := bufio.NewScanner(dec)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在包中找到更多编码golang.org/x/text/encoding/charmap,您可以根据自己的喜好插入我的示例中.