首頁 >後端開發 >Golang >如何在 Go 中正確讀取 UTF-16 文字檔案作為字串?

如何在 Go 中正確讀取 UTF-16 文字檔案作為字串?

Susan Sarandon
Susan Sarandon原創
2024-12-30 13:28:14175瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn