首页 > 后端开发 > Golang > 如何在 Go 中正确读取 UTF-16 文本文件作为字符串?

如何在 Go 中正确读取 UTF-16 文本文件作为字符串?

Susan Sarandon
发布: 2024-12-30 13:28:14
原创
171 人浏览过

How Can I Correctly Read a UTF-16 Text File as a String in Go?

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

理解问题

将 UTF-16 文本文件读取为字节时使用标准输入法读取数组时,文件的 UTF-16 编码字符可能无法正确解释。这可能会导致字节被视为 ASCII,从而导致不正确的字符串表示。

使用 UTF-16 解码的解决方案

要正确读取 UTF-16 文本文件,使用以下命令至关重要专门设计用于处理 UTF-16 编码的方法。 golang.org/x/text/encoding/unicode 包为此目的提供了必要的功能。

ReadFileUTF16() 函数

func ReadFileUTF16(filename string) ([]byte, error) {
    // Read the file into a byte array
    raw, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }

    // Create a transformer that converts MS-Windows default to UTF8
    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)

    // Override the BOM to ensure it is respected
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    // Apply the transformer to the input byte array
    unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom)

    // Decode the data into a new byte array
    decoded, err := ioutil.ReadAll(unicodeReader)
    return decoded, err
}
登录后复制

NewScannerUTF16() 函数

对于读取整个文件不可行的情况,以下函数创建一个使用相同 UTF-16 解码的扫描器逻辑:

func NewScannerUTF16(filename string) (utfScanner, error) {
    // Read the file into a []byte
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    // Create a transformer that converts MS-Windows default to UTF8
    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)

    // Override the BOM to ensure it is respected
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    // Apply the transformer to the input file
    unicodeReader := transform.NewReader(file, utf16bom)
    return unicodeReader, nil
}
登录后复制

关于 BOM 和 Unicode 支持的讨论

golang.org/x/text/encoding/unicode 包智能地解释字节顺序标记 (BOM) 以确定中使用的编码文件。但需要注意的是,bufio 包的 ReadLine 函数不支持 Unicode 解码。

更多资源

有关 UTF-16 解码的其他自定义和选项,请参阅开源模块位于 https://github.com/TomOnTime/utfutil/。

以上是如何在 Go 中正确读取 UTF-16 文本文件作为字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板