为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中从编码转换为 UTF-8?

如何在 Go 中从编码转换为 UTF-8?

Go
心有法竹 2021-11-08 14:40:30
我正在做一个项目,我需要将文本从编码(例如 Windows-1256 阿拉伯语)转换为 UTF-8。我如何在 Go 中做到这一点?
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以使用编码包,其中包括通过包支持 Windows-1256 golang.org/x/text/encoding/charmap(在下面的示例中,导入此包并使用charmap.Windows1256代替japanese.ShiftJIS)。


这是一个简短的示例,它将日语 UTF-8 字符串编码为 ShiftJIS 编码,然后将 ShiftJIS 字符串解码回 UTF-8。不幸的是,它在操场上不起作用,因为操场没有“x”包。


package main


import (

    "bytes"

    "fmt"

    "io/ioutil"

    "strings"


    "golang.org/x/text/encoding/japanese"

    "golang.org/x/text/transform"

)


func main() {

    // the string we want to transform

    s := "今日は"

    fmt.Println(s)


    // --- Encoding: convert s from UTF-8 to ShiftJIS 

    // declare a bytes.Buffer b and an encoder which will write into this buffer

    var b bytes.Buffer

    wInUTF8 := transform.NewWriter(&b, japanese.ShiftJIS.NewEncoder())

    // encode our string

    wInUTF8.Write([]byte(s))

    wInUTF8.Close()

    // print the encoded bytes

    fmt.Printf("%#v\n", b)

    encS := b.String()

    fmt.Println(encS)


    // --- Decoding: convert encS from ShiftJIS to UTF8

    // declare a decoder which reads from the string we have just encoded

    rInUTF8 := transform.NewReader(strings.NewReader(encS), japanese.ShiftJIS.NewDecoder())

    // decode our string

    decBytes, _ := ioutil.ReadAll(rInUTF8)

    decS := string(decBytes)

    fmt.Println(decS)

}

日本 StackOverflow 站点上有一个更完整的示例。文字是日文,但代码应该是不言自明的


查看完整回答
反对 回复 2021-11-08
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我查看了文档,here,我想出了一种将字节数组转换为(或从)UTF-8 的方法。


我遇到的困难是,到目前为止,我还没有找到允许我使用语言环境的界面。相反,它就像可能的方式仅限于预定义的编码集。


就我而言,我需要将 UTF-16(实际上我有 USC-2 数据,但它应该仍然有效)转换为 UTF-8。为此,我需要检查 BOM,然后进行转换:


bom := buf[0] + buf[1] * 256

if bom == 0xFEFF {

    enc = unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM)

} else if bom == 0xFFFE {

    enc = unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)

} else {

    return Error("BOM missing")

}


e := enc.NewDecoder()


// convert USC-2 (LE or BE) to UTF-8

utf8 := e.Bytes(buf[2:])

不幸的是,我必须使用“忽略”BOM,因为在我的情况下,它应该被禁止超过第一个字符。但这对我的情况来说已经足够了。这些功能在几个地方提到过,但没有在实践中展示。


查看完整回答
反对 回复 2021-11-08
?
倚天杖

TA贡献1828条经验 获得超3个赞

我为自己做了一个工具,也许你可以从中借鉴一些想法:)


https://github.com/gonejack/transcode


这是关键代码:


_, err = io.Copy(

    transform.NewWriter(output, targetEncoding.NewEncoder()),

    transform.NewReader(input, sourceEncoding.NewDecoder()),

)


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 853 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信