Lecture de fichiers Unicode avec une marque d'ordre d'octet (BOM)
Introduction
Lors du traitement de fichiers Unicode , il est essentiel de gérer la présence ou l'absence d'un BOM (Byte-Order Mark). Dans Go, il n'existe pas de solution intégrée pour détecter et traiter automatiquement les nomenclatures. Cependant, il existe des approches pratiques pour résoudre ce scénario.
Approche du lecteur tamponné
L'utilisation d'un lecteur tamponné vous permet de jeter un coup d'œil dans les premiers octets du fichier. Voici un exemple simple :
<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>
Approche de l'interface Seeker
Si vous avez un objet qui implémente l'interface io.Seeker (par exemple, un *os.File), vous pouvez vérifiez les trois premiers octets et revenez au début du fichier s'il ne s'agit pas d'une nomenclature.
<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>
Considérations
Ces exemples supposent un encodage UTF-8. Si vous devez gérer différents encodages ou flux non recherchés, des stratégies supplémentaires peuvent être nécessaires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!