Unicode-Dateien mit Byte-Order Mark (BOM) lesen
Einführung
Beim Umgang mit Unicode-Dateien ist es wichtig, das Vorhandensein oder Fehlen einer BOM (Byte-Order Mark) zu verwalten. In Go gibt es keine integrierte Lösung zur automatischen Erkennung und Verarbeitung von Stücklisten. Es gibt jedoch praktische Ansätze, um dieses Szenario anzugehen.
Puffered-Reader-Ansatz
Mit einem gepufferten Reader können Sie einen Blick in die ersten paar Bytes der Datei werfen. Hier ist ein einfaches Beispiel:
<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 } // Continue working with br as you would with fd }</code>
Seeker-Schnittstellenansatz
Wenn Sie ein Objekt haben, das die io.Seeker-Schnittstelle implementiert (z. B. eine *os.File), können Sie dies tun Überprüfen Sie die ersten drei Bytes und suchen Sie zurück zum Anfang der Datei, wenn es sich nicht um eine Stückliste handelt.
<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) } } // Continue reading real data from fd }</code>
Überlegungen
Diese Beispiele gehen von der UTF-8-Kodierung aus. Wenn Sie unterschiedliche Kodierungen oder nicht durchsuchbare Streams verarbeiten müssen, sind möglicherweise zusätzliche Strategien erforderlich.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Byte-Order Marks (BOMs) in Unicode-Dateien in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!