Go에서 BOM(바이트 순서 표시)이 있는 파일 읽기
유니코드 파일을 읽을 때 BOM(바이트 순서 표시)이 필요할 수 있습니다. 특별한 취급. BOM을 수동으로 확인하고 삭제하는 대신 Go에서 BOM을 처리하기 위한 표준화되거나 권장되는 방법이 있나요?
BOM을 읽는 표준 방법
At the 핵심 라이브러리 수준에는 BOM을 구체적으로 처리하기 위해 구현된 표준화된 방법이 없습니다. 그러나 표준 Go 라이브러리는 낮은 수준의 작업을 수행하는 데 탁월하므로 사용자 정의 BOM 처리 메커니즘을 쉽게 구현할 수 있습니다.
구현 예
버퍼링 사용 리더:
버퍼 리더는 BOM 관리를 위한 편리한 접근 방식을 제공합니다. 입력 파일 설명자 주위에 버퍼링된 판독기를 래핑하면 다음 예에서 볼 수 있듯이 BOM을 효율적으로 확인하고 삭제할 수 있습니다.
<code class="go">import ( "bufio" "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer closeOrDie(fd) br := bufio.NewReader(fd) r, _, err := br.ReadRune() if err != nil { log.Fatal(err) } if r != '\uFEFF' { br.UnreadRune() // Not a BOM -- put the rune back } // Now work with br as you would do with fd // ... }</code>
io.Seeker 인터페이스 사용:
io.Seeker 인터페이스를 구현하는 객체의 경우 대체 접근 방식은 파일의 처음 3바이트를 읽고 BOM 패턴을 확인하는 것입니다. BOM이 발견되지 않으면 아래 그림과 같이 io.Seek()를 사용하여 파일 설명자를 처음으로 되돌릴 수 있습니다.
<code class="go">import ( "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer closeOrDie(fd) bom := [3]byte _, err = io.ReadFull(fd, bom[:]) if err != nil { log.Fatal(err) } if bom[0] != 0xef || bom[1] != 0xbb || bom[2] != 0xbf { _, err = fd.Seek(0, 0) // Not a BOM -- seek back to the beginning if err != nil { log.Fatal(err) } } // The next read operation on fd will read real data // ... }</code>
이 예제에서는 파일이 UTF-8로 인코딩되었다고 가정합니다. 다른 인코딩이나 알 수 없는 인코딩을 처리하는 경우 추가 논리가 필요할 수 있습니다.
위 내용은 Go에서 유니코드 파일을 읽을 때 BOM(바이트 순서 표시)을 어떻게 처리하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!