Lesen von Dateien mit Byte Order Marks (BOMs) in Go
Beim Lesen von Unicode-Dateien kann es erforderlich sein, auf eine Byte Order Mark (BOM) zu stoßen besondere Handhabung. Gibt es standardisierte oder empfohlene Methoden für den Umgang mit Stücklisten in Go, anstatt manuell nach einer Stückliste zu suchen und diese zu verwerfen?
Standardmethode zum Lesen von Stücklisten
Am Auf der Ebene der Kernbibliothek gibt es keine standardisierte Methode zur spezifischen Handhabung von Stücklisten. Die standardmäßigen Go-Bibliotheken zeichnen sich jedoch dadurch aus, dass sie Vorgänge auf niedriger Ebene ausführen, was die Implementierung benutzerdefinierter Stücklistenverarbeitungsmechanismen vereinfacht.
Beispielimplementierungen
Verwendung eines Buffered Leser:
Ein gepufferter Leser bietet einen komfortablen Ansatz zur Verwaltung von Stücklisten. Indem ein gepufferter Reader um den Eingabedateideskriptor gewickelt wird, kann die Stückliste effizient überprüft und verworfen werden, wie im folgenden Beispiel zu sehen ist:
<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>
Verwendung der io.Seeker-Schnittstelle:
Für Objekte, die die io.Seeker-Schnittstelle implementieren, besteht ein alternativer Ansatz darin, die ersten drei Bytes der Datei zu lesen und auf das Stücklistenmuster zu prüfen. Wenn keine Stückliste gefunden wird, kann der Dateideskriptor mit io.Seek() an den Anfang zurückgespult werden, wie unten dargestellt:
<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>
Beachten Sie, dass in diesen Beispielen davon ausgegangen wird, dass die Datei in UTF-8 codiert ist. Wenn es sich um andere oder unbekannte Kodierungen handelt, ist möglicherweise weitere Logik erforderlich.
Das obige ist der detaillierte Inhalt vonWie gehen Sie mit Byte Order Marks (BOMs) um, wenn Sie Unicode-Dateien in Go lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!