>백엔드 개발 >Golang >Go에서 UTF-16 텍스트 파일을 올바르게 읽고 디코딩하는 방법은 무엇입니까?

Go에서 UTF-16 텍스트 파일을 올바르게 읽고 디코딩하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-20 17:42:10497검색

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

Go에서 UTF-16 텍스트 파일을 읽는 방법

문제 이해

많은 파일 형식은 2바이트 유니코드 인코딩인 UTF-16 인코딩을 사용하여 텍스트 데이터를 인코딩합니다. Go에서 UTF-16 파일을 읽을 때 실제 텍스트 콘텐츠를 얻으려면 바이트를 올바르게 디코딩하는 것이 중요합니다. 그러나 Go의 기본 동작은 UTF-16 바이트를 ASCII로 처리하는 것이므로 잘못된 결과가 발생할 수 있습니다.

UTF-16 파일 디코딩

UTF-16 파일을 올바르게 읽으려면 파일을 읽을 때 인코딩을 지정해야 합니다. Go는 이러한 목적으로 unicode.UTF16 디코더를 제공합니다. 제공하신 코드의 업데이트된 버전은 다음과 같습니다.

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)
}

이 코드는 unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)을 사용하여 빅엔디안 바이트 순서로 UTF-16용 디코더를 생성하고 BOM(바이트 순서 표시)을 무시합니다. BOM은 파일의 바이트 순서를 나타내는 데 사용되지만 이를 무시하므로 BOM에 관계없이 코드가 올바르게 작동합니다.

그런 다음 디코딩된 바이트는 string() 함수를 사용하여 문자열로 변환됩니다. . 마지막으로 strings.Replace()를 사용하여 모든 Windows 스타일 줄 끝을 제거합니다.

UTF-16 파일용 새 스캐너 사용

파일을 읽어야 하는 경우 한 줄씩 ioutil.ReadFile 대신 golang.org/x/text 패키지의 New ScannerUTF16 함수를 사용할 수 있습니다. 예는 다음과 같습니다.

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())
    }
}

이 코드는 bufio.NewScanner() 함수를 사용하여 UTF-16 바이트를 디코딩하는 변환된 판독기에서 읽는 스캐너를 만듭니다. 스캐너를 사용하면 전체 파일을 메모리로 읽어오지 않고도 파일 줄을 반복할 수 있습니다.

위 내용은 Go에서 UTF-16 텍스트 파일을 올바르게 읽고 디코딩하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.