Character encoding 在Go中读取非UTF-8文本文件

Character encoding 在Go中读取非UTF-8文本文件,character-encoding,go,Character Encoding,Go,我需要读取一个编码为的文本文件。Go编程语言中的标准库假定所有文本都以UTF-8编码 如何读取其他编码的文件?试试。它包装iconv并实现io.Reader和io.Writer golang china讨论组中提到了一些使用iconv的例子。之前(如旧答案中所述),实现这一点的“简单”方法是使用需要cgo的第三方软件包并包装iconv库。出于许多原因,这是不可取的。谢天谢地,相当长一段时间以来,只有使用Go作者提供的包(不是在主包集中,而是在主包中)才能实现这一点 该包为通用字符编码定义了一个接

我需要读取一个编码为的文本文件。Go编程语言中的标准库假定所有文本都以UTF-8编码

如何读取其他编码的文件?

试试。它包装
iconv
并实现
io.Reader
io.Writer

golang china讨论组中提到了一些使用iconv的例子。

之前(如旧答案中所述),实现这一点的“简单”方法是使用需要cgo的第三方软件包并包装iconv库。出于许多原因,这是不可取的。谢天谢地,相当长一段时间以来,只有使用Go作者提供的包(不是在主包集中,而是在主包中)才能实现这一点

该包为通用字符编码定义了一个接口,该编码可以转换为UTF-8或从UTF-8转换为UTF-8。子包提供了编码和编码实现

下面是一个读取和写入GBK编码文件的示例。请注意,
io.Reader
io.Writer
在读取/写入数据时进行“动态”编码

主程序包
进口(
“布菲奥”
“fmt”
“日志”
“操作系统”
“golang.org/x/text/encoding/simplifiedchinese”
“golang.org/x/text/transform”
)
//要使用的编码。因为这实现了编码
//来自golang.org/x/text/encoding的接口
//将此更改为任何其他已实现的编码器,
//例如,`traditionalchinese.Big5`、`charmap.Windows1252`,
//'korean.EUCKR`,等等。
var enc=simplifiedchinese.GBK
func main(){
const filename=“示例\u GBK\u文件”
示例WriteGBK(文件名)
示例ReadGBK(文件名)
}
func exampleReadGBK(文件名字符串){
//从GBK编码的文件中读取UTF-8。
f、 错误:=os.Open(文件名)
如果错误!=零{
log.Fatal(错误)
}
r:=transform.NewReader(f,enc.NewDecoder())
//根据需要从'r'读取转换后的UTF-8。
//例如,我们将逐行阅读,显示所读内容:
sc:=bufio.NewScanner(右)
对于sc.Scan(){
fmt.Printf(“读取行:%s\n”,sc.Bytes())
}
如果err=sc.err();err!=nil{
log.Fatal(错误)
}
如果err=f.Close();err!=nil{
log.Fatal(错误)
}
}
func exampleWriteGBK(文件名字符串){
//将UTF-8写入GBK编码的文件。
f、 错误:=os.Create(文件名)
如果错误!=零{
log.Fatal(错误)
}
w:=transform.NewWriter(f,enc.NewEncoder())
//根据需要将UTF-8写入“w”。
//例如,我们将从维基百科中编写一些文本
//包含中文的GBK页面。
_,err=fmt.Fprintln(w,
`1995年,中国国家信息技术标准化委员会
技术委员会制定了中国内部代码规范
(中文:汉字内码扩展规范(GBK);拼音:HánzìNèimǎ
Kuòzhǎn Guīfán(GBK)),版本1.0,称为GBK1.0,是一个
代码页936的轻微扩展。新添加的95个字符不可用
在GB 13000.1-1993中发现,并被临时指定为Unicode PUA
代码点。`)
如果错误!=零{
log.Fatal(错误)
}
如果err=f.Close();err!=nil{
log.Fatal(错误)
}
}

另一种选择是将文件作为不透明的blob读入缓冲区,然后使用;有关更多信息,请参阅。我没有看代码,但为了支持一组最常用的遗留字符集/编码,此软件包不需要iconv,这可能是一个优势。@kostix从标题页上的信息可以看出,在gbk的情况下,该软件包使用GNU iconv库。此软件包还可用于执行转换:这看起来是一个非常合理和明确的问题,投票重新打开(即使是原始形式)