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

Go에서 UTF-16으로 인코딩된 텍스트 파일을 올바르게 읽고 구문 분석하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-30 21:16:17936검색

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

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

UTF-16으로 인코딩된 텍스트 파일을 처리할 때 Go의 표준 bufio 패키지가 유니코드 문자를 해석하지 못할 수 있습니다. 줄 바꿈 처리의 한계로 인해 올바르게 작동합니다. 이로 인해 파일 내용을 문자열로 변환하고 의도한 유니코드 값을 유지하는 데 문제가 발생할 수 있습니다.

한 가지 해결책은 유니코드를 도입한 golang.org/x/text/encoding/unicode의 최신 버전을 사용하는 것입니다. .BOM 재정의. 이 기능은 BOM(바이트 순서 표시)을 지능적으로 감지하고 그에 따라 파일을 디코딩합니다.

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "strings"

    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

// ReadFileUTF16 is similar to ioutil.ReadFile() but decodes UTF-16.
func ReadFileUTF16(filename string) ([]byte, error) {
    raw, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }

    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    unicodeReader := transform.NewReader(bytes.NewReader(raw), utf16bom)

    decoded, err := ioutil.ReadAll(unicodeReader)
    return decoded, err
}

func main() {
    data, err := ReadFileUTF16("inputfile.txt")
    if err != nil {
        log.Fatal(err)
    }
    final := strings.Replace(string(data), "\r\n", "\n", -1)
    fmt.Println(final)
}

한 줄씩 텍스트 구문 분석을 처리하려면 NewScannerUTF16을 사용할 수 있습니다.

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"

    "golang.org/x/text/encoding/unicode"
    "golang.org/x/text/transform"
)

type utfScanner interface {
    Read(p []byte) (n int, err error)
}

// NewScannerUTF16 creates a scanner similar to os.Open() but decodes the file as UTF-16.
func NewScannerUTF16(filename string) (utfScanner, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    win16be := unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM)
    utf16bom := unicode.BOMOverride(win16be.NewDecoder())

    unicodeReader := transform.NewReader(file, utf16bom)
    return unicodeReader, nil
}

func main() {
    s, err := NewScannerUTF16("inputfile.txt")
    if err != nil {
        log.Fatal(err)
    }

    scanner := bufio.NewScanner(s)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading inputfile:", err)
    }
}

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

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