將UTF-16 文字檔案讀取為字節時使用標準輸入法讀取陣列時,檔案的UTF-16 編碼字元可能無法正確解釋。這可能會導致位元組被視為 ASCII,從而導致不正確的字串表示。
要正確讀取 UTF-16 文字文件,使用以下命令至關重要專門設計用於處理 UTF-16 編碼的方法。 golang.org/x/text/encoding/unicode 套件為此目的提供了必要的功能。
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 }
對於讀取整個檔案不可行的情況,以下函數會建立一個使用相同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 }
golang.org/x/text/encoding/unicode 套件聰明地解釋位元組順序標記 (BOM) 以確定中使用的編碼檔案。但要注意的是,bufio 套件的 ReadLine 函數不支援 Unicode 解碼。
有關 UTF-16 解碼的其他自訂和選項,請參閱開源模組位於 https://github.com/TomOnTime/utfutil/。
以上是如何在 Go 中正確讀取 UTF-16 文字檔案作為字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!