Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中使用bufio扫描仪读取unicode字符_Unicode_Go - Fatal编程技术网

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

在Go中使用bufio扫描仪读取unicode字符,unicode,go,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()) } package main im

我试图读取一个纯文本文件,其中包含这样的名称:“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())
}
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())
    }
}
然后,当读取“CASTAñEDA”时,它会打印“CASTA”�EDA“

用bufio阅读时有没有办法处理这些字符


谢谢。

您遇到的问题是您的输入可能不是UTF-8(这是bufio和大多数Go语言/stdlib所期望的)。相反,您的输入可能使用了一些扩展的ASCII代码页,这就是为什么非注释字符可以干净地通过(UTF-8也是7位ASCII的超集),但“ñ”不能完整地通过

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

  • 将输入文件转换为UTF-8,然后再将其传递给Go。有许多实用程序可以做到这一点,而编辑器通常具有这一功能
  • 尝试与一起使用将输入转换为UTF-8。将生成的读取器传递给bufio.NewScanner
  • 将循环中的行更改为
    os.Stdout.Write(scanner.Bytes());fmt.Println()这可以避免在换行符拆分之外将字节解释为UTF-8。将字节直接写入操作系统Stdout将进一步避免对内容的任何(错误)解释

  • 您的文件很可能是非UTF-8文件。因此(go希望所有字符串都是UTF-8),您的控制台输出看起来被破坏了。在您的情况下,我建议使用包
    golang.org/x/text/encoding/charmap
    golang.org/x/text/transform
    ,将文件数据转换为UTF-8。正如我可能推测的那样,查看文件路径,您在Windows上。因此,您的字符编码可能是
    Windows1252
    (如果您使用notepad.exe等工具进行了编辑)

    试着这样做:

    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())
    }
    
    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())
        }
    }
    
    主程序包
    进口(
    “布菲奥”
    “fmt”
    “日志”
    “操作系统”
    “golang.org/x/text/encoding/charmap”
    “golang.org/x/text/transform”
    )
    func main(){
    文件,err:=os.Open(“C:/temp/file.txt”)
    延迟文件。关闭()
    如果错误!=零{
    log.Fatal(错误)
    }
    
    dec:=transform.NewReader(文件,charmap.Windows1252.NewDecoder())你的终端支持utf8吗?如果你
    cat file.txt
    ,它打印正确吗?这也可能是错误的编码。例如,它是UTF-16还是什么?(如果是,请参阅)非常感谢你的回答,我最后用charmap这个方式:charconv:=transform.NewReader(文件charmap.Windows1252.NewDecoder())是否关闭解码器或读取器,从
    transform.NewReader
    返回?