首页 >后端开发 >Golang >如何在 Go 中正确读取 UTF-16 文本文件,同时处理 BOM 和非 BOM 编码?

如何在 Go 中正确读取 UTF-16 文本文件,同时处理 BOM 和非 BOM 编码?

Susan Sarandon
Susan Sarandon原创
2024-12-27 15:32:11336浏览

How Can I Correctly Read UTF-16 Text Files in Go, Handling Both BOM and Non-BOM Encodings?

在 Go 中将 UTF-16 文本文件读取为字符串

在 Go 中读取 UTF-16 文本文件时,可能会遇到字节被解释为 ASCII 的问题。出现这种情况是因为标准 bufio.NewReader 函数无法正确处理 unicode。

解决方案

UTF-16 with BOM

最新版本的“golang.org/x /text/encoding/unicode”引入了unicode.BOMOverride,它自动检测并解释BOM以正确解码UTF-16。以下是使用 ReadFileUTF16() 的示例:

func ReadFileUTF16(filename string) ([]byte, error) {
    raw, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())
    unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom)
    decoded, err := ioutil.ReadAll(unicodeReader)
    return decoded, err
}

此函数将解码带有 BOM 的 UTF-16 文件。

不带 BOM 的 UTF-16

如果您的文件包含不包含BOM,可以使用以下代码:

func ReadFileUTF16WithoutBOM(filename string) ([]byte, error) {
    f, err := os.Open(filename)
    if err != nil {
        return nil, err
    }
    r := bufio.NewReader(f)

    // Read past the BOM, if any.
    var b, e = r.Peek(2)
    if (b[0] == 0xFF && b[1] == 0xFE) || (b[0] == 0xFE && b[1] == 0xFF) {
        r.Discard(2)
    }

    // Read the rest of the file.
    decoded, err := ioutil.ReadAll(r)
    return decoded, err
}

此函数将跳过任何 BOM 并将文件读取为 UTF-16。

结论

通过使用 ReadFileUTF16() 或 ReadFileUTF16WithoutBOM(),您可以在 Go 中处理 BOM 和非 BOM UTF-16 文本文件,确保数据的准确解码和表示。

以上是如何在 Go 中正确读取 UTF-16 文本文件,同时处理 BOM 和非 BOM 编码?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn