在Go中使用bufio扫描仪读取unicode字符
我试图读取一个纯文本文件,其中包含这样的名称:“CASTAñEDA” 代码基本上是这样的:在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
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)。您有几个选择:
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
返回?