如何在Go 中讀取UTF-16 文字檔案
理解問題
理解問題許多>
許多文件格式使用UTF-16 編碼(一種兩位元組Unicode 編碼)對文字資料進行編碼。當您在 Go 中讀取 UTF-16 檔案時,正確解碼位元組以獲得實際的文字內容非常重要。然而,Go 中的預設行為是將 UTF-16 位元組視為 ASCII,這可能會導致錯誤的結果。package main import ( "bytes" "fmt" "io/ioutil" "os" "strings" "golang.org/x/text/encoding/unicode" ) func main() { // Read the file into a []byte raw, err := ioutil.ReadFile("test.txt") if err != nil { fmt.Printf("error opening file: %v\n", err) os.Exit(1) } // Create a Unicode UTF-16 decoder utf16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // Create a transformer to decode the data transformer := utf16be.NewDecoder() // Decode the text using the transformer decoded, err := transformer.Bytes(raw) if err != nil { fmt.Printf("error decoding file: %v\n", err) os.Exit(1) } // Convert the decoded bytes to a string text := string(decoded) // Remove any Windows-style line endings (CR+LF) final := strings.Replace(text, "\r\n", "\n", -1) // Print the final text fmt.Println(final) }
讀取正確的UTF-16文件,讀取文件時需要指定編碼。 Go 為此提供了 unicode.UTF16 解碼器。這是您提供的程式碼的更新版本:
此程式碼使用unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) 建立具有大端位元組順序的UTF-16 解碼器忽略任何字節順序標記(BOM)。 BOM 用於指示檔案的位元組順序,但由於我們忽略它,因此無論 BOM 如何,程式碼都會正常運作。
然後使用 string() 函數將解碼後的位元組轉換為字串。最後,使用 strings.Replace() 刪除所有 Windows 樣式的行結尾。package main import ( "bufio" "fmt" "os" "golang.org/x/text/encoding/unicode" "golang.org/x/text/transform" ) func NewScannerUTF16(filename string) (*bufio.Scanner, error) { // Read the file into a []byte raw, err := os.ReadFile(filename) if err != nil { return nil, err } // Create a Unicode UTF-16 decoder utf16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // Create a transformer to decode the data transformer := utf16be.NewDecoder() // Create a scanner that uses the transformer scanner := bufio.NewScanner(transform.NewReader(bytes.NewReader(raw), transformer)) return scanner, nil } func main() { // Create a scanner for the UTF-16 file scanner, err := NewScannerUTF16("test.txt") if err != nil { fmt.Printf("error opening file: %v\n", err) os.Exit(1) } // Read the file line by line for scanner.Scan() { fmt.Println(scanner.Text()) } }
以上是如何在Go中正確讀取和解碼UTF-16文字檔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!