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 중국어 웹사이트의 기타 관련 기사를 참조하세요!