在 Go 中读取 UTF-16 文本文件时,可能会遇到字节被解释为 ASCII 的问题。出现这种情况是因为标准 bufio.NewReader 函数无法正确处理 unicode。
最新版本的“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,可以使用以下代码:
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中文网其他相关文章!