首頁 > 後端開發 > Golang > 如何在Go中正確讀取和解碼UTF-16文字檔?

如何在Go中正確讀取和解碼UTF-16文字檔?

Linda Hamilton
發布: 2024-12-20 17:42:10
原創
535 人瀏覽過

How to Correctly Read and Decode UTF-16 Text Files in Go?

如何在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 文件

讀取正確的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())
    }
}
登入後複製
使用新掃描器掃描UTF-16 檔案

如果您需要讀取檔案逐行,您可以使用golang.org/x/text 套件中的New ScannerUTF16 函數來取代ioutil.ReadFile。以下是一個範例:此程式碼使用bufio.NewScanner() 函數建立一個掃描儀,該掃描儀從轉換後的讀取器中讀取數據,並解碼UTF-16 位元組。透過使用掃描儀,您可以迭代文件的行,而無需將整個文件讀入記憶體。

以上是如何在Go中正確讀取和解碼UTF-16文字檔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板