使用Go中的bufio扫描仪读取unicode字符

时间:2015-04-16 21:55:15

标签: unicode go

我正在尝试阅读包含以下名称的纯文本文件:“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())
}

然后,当读取“CASTAÑEDA”时,它会打印“CASTA EDA”

使用bufio阅读时,有什么方法可以处理这些字符吗?

感谢。

2 个答案:

答案 0 :(得分:5)

您遇到的问题是您的输入可能不是UTF-8(这是bufio和大多数Go语言/ stdlib所期望的)。相反,你的输入可能使用一些扩展的ASCII代码页,这就是为什么非重音字符干净利落地传递(UTF-8也是7位ASCII的超集),但是'Ñ'不能完整地传递。 / p>

在这种情况下,重音字符的位表示无效UTF-8,因此正在生成unicode替换字符(U + FFFD)。你有几个选择:

  1. 在将输入文件传递给Go之前将其转换为UTF-8。有许多实用程序可以执行此操作,编辑器通常具有此功能。
  2. 尝试将golang.org/x/text/encoding/charmapNewReader from golang.org/x/text/transform一起使用,将输入转换为UTF-8。将生成的Reader传递给bufio.NewScanner
  3. 将循环中的行更改为os.Stdout.Write(scanner.Bytes()); fmt.Println();这可以避免将字节解释为UTF-8超出换行符分割。将字节直接写入os.Stdout将进一步避免对内容的任何(错误)解释。

答案 1 :(得分:5)

您的文件最可能是非UTF-8。因此(go期望所有字符串都是UTF-8),你的控制台输出看起来很糟糕。在您的情况下,我建议您使用包golang.org/x/text/encoding/charmapgolang.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())
    }
}

您可以在golang.org/x/text/encoding/charmap包中找到更多编码,您可以根据自己的喜好插入我的示例中。