유니코드 파일로 작업할 때 BOM(바이트 순서 표시)이 있으면 파일 구문 분석에 영향을 미칠 수 있습니다. 모든 유니코드 파일에 BOM이 포함되어 있는 것은 아니지만 크로스 플랫폼 데이터를 처리할 때 이를 고려하는 것이 중요합니다.
안타깝게도 Go 표준 라이브러리에는 BOM을 위한 내장 방법이 부족합니다. BOM 처리. 그러나 여러 접근 방식을 사용하면 BOM이 포함된 파일을 수동으로 확인하고 처리할 수 있습니다.
버퍼 리더 사용
파일 스트림과 호출 프로그램 사이의 버퍼링 리더를 사용하면 처음 몇 바이트를 검사하고 BOM이 발견되면 선택적으로 삭제할 수 있습니다. 다음 스니펫은 이 접근 방식을 보여줍니다.
<code class="go">import ( "bufio" "os" "log" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer fd.Close() 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 if you would with fd }</code>
io.Seeker 사용
또는 io.Seeker 인터페이스를 사용하여 파일 스트림 내에서 검색할 수 있습니다. 처음 3바이트가 BOM이 아닌 경우 처음부터 다시 탐색하세요.
<code class="go">import ( "os" "log" "io" ) func main() { fd, err := os.Open("filename") if err != nil { log.Fatal(err) } defer fd.Close() 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로 인코딩된 것으로 가정합니다. 인코딩 정보를 알 수 없거나 다른 경우에는 더 복잡한 접근 방식이 필요할 수 있습니다. 정확한 구문 분석과 데이터 무결성을 보장하려면 유니코드 파일로 작업할 때 BOM을 적절하게 처리해야 합니다.
위 내용은 Go 파일에서 BOM(바이트 순서 표시)을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!