Maison  >  Article  >  développement back-end  >  Une brève analyse de la méthode golang de suppression des caractères de nomenclature dans l'encodage UTF-8

Une brève analyse de la méthode golang de suppression des caractères de nomenclature dans l'encodage UTF-8

PHPz
PHPzoriginal
2023-04-26 10:32:32902parcourir

UTF-8 est une méthode de codage du jeu de caractères Unicode, qui utilise une longueur d'octet variable pour représenter les caractères. Cependant, dans le codage UTF-8, il existe un caractère spécial appelé BOM (Byte Order Mark), qui est utilisé pour identifier l'ordre des octets du texte, il est donc également appelé identifiant d'ordre des octets.

Dans certains scénarios, la nomenclature peut causer des problèmes. Par exemple, lors de l'utilisation de certains outils pour traiter du texte, des erreurs peuvent survenir en raison de la nomenclature. Par conséquent, cet article explique comment utiliser Golang pour supprimer les caractères de nomenclature dans l'encodage UTF-8.

Le rôle de BOM

Dans le jeu de caractères Unicode, il existe plusieurs méthodes d'encodage, telles que UTF-8, UTF-16, etc. Parmi eux, UTF-16 utilise un codage sur deux octets et chaque caractère occupe 2 octets. Dans le codage UTF-16, la représentation d'un caractère est divisée en deux octets, de poids fort et de poids faible. Cependant, en raison des différents processeurs CPU des ordinateurs, certains processeurs CPU stockent les données de manière big-endian (Big-Endian), tandis que d'autres CPU stockent les données de manière low-endian (Little-Endian).

Par conséquent, dans l'encodage non-UTF-8, pour que le décodeur détermine correctement l'ordre des octets des caractères, un caractère spécial, le caractère BOM, doit être inséré au début du texte . Il existe deux formes de caractères de nomenclature, à savoir U+FEFF et U+FFFE. Parmi eux, U+FEFF représente l'ordre des octets Big-Endian et U+FFFE représente l'ordre des octets Little-Endian. Les caractères de nomenclature sont souvent utilisés dans les encodages UTF-16 et UTF-32.

Cependant, dans l'encodage UTF-8, puisque la longueur en octets de chaque caractère est différente, il n'est pas nécessaire d'utiliser des caractères de nomenclature pour identifier les octets de texte comme les séquences UTF-16 et UTF-32. Cependant, afin d'être compatible avec d'autres méthodes d'encodage, la méthode d'encodage UTF-8 peut également insérer des caractères BOM au début du texte pour identifier la méthode d'encodage du texte.

Comment supprimer la nomenclature

Bien que tous les textes UTF-8 n'insèrent pas des caractères de nomenclature, dans certains cas, nous devons quand même supprimer les caractères de nomenclature. Par exemple :

  • Vous souhaitez effectuer un traitement spécifique sur le texte, mais pour les caractères de la nomenclature, l'outil de traitement peut ne pas être en mesure de le gérer ;
  •  ; Vous devez convertir le texte dans un autre format, tel que JSON, XML, etc., et ces formats sont très sensibles aux caractères de la nomenclature, ce qui entraînera des erreurs d'analyse.

Dans Golang, vous pouvez utiliser certaines méthodes de la bibliothèque unicode/utf8 et de la bibliothèque d'octets pour supprimer les caractères de nomenclature. Ci-dessous, nous présenterons respectivement la mise en œuvre de ces deux méthodes.

Méthode 1 : Utiliser la bibliothèque unicode/utf8

La bibliothèque unicode/utf8 fournit une fonction appelée SkipBOM, qui peut être utilisée pour ignorer le caractère BOM dans l'encodage UTF-8 . La définition de cette fonction est la suivante :

func SkipBOM(p []byte) []byte

Les paramètres de cette fonction sont des tableaux d'octets, et la valeur de retour est également un tableau d'octets, avec les caractères de nomenclature supprimés.

Ce qui suit est un exemple spécifique :

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    str := "\ufeffHello World"
    b := []byte(str)

    // 去除BOM字符
    b = utf8.SkipBOM(b)
    str = string(b)

    fmt.Println(str)
}

Le résultat de sortie est :

Hello World

L'utilisation de la fonction SkipBOM est très simple, il vous suffit de ajoutez les caractères à traiter Convertissez la chaîne en tableau d'octets, puis appelez la fonction SkipBOM. Dans cet exemple, nous définissons d'abord une chaîne avec des caractères de nomenclature, puis la convertissons en tableau d'octets. Ensuite, appelez la fonction SkipBOM pour supprimer les caractères de nomenclature et enfin convertissez le tableau d'octets en chaîne pour la sortie.

Il est à noter que lors de l'appel de la fonction SkipBOM, s'il n'y a pas de caractère BOM dans le tableau d'octets, la fonction renverra directement le tableau d'octets d'origine sans aucun impact.

Méthode 2 : Utiliser la bibliothèque d'octets

La bibliothèque d'octets fournit également une méthode pour supprimer les caractères de nomenclature, l'implémentation spécifique est la suivante :

func TrimBOM(s []byte) []byte {
    if len(s) >= 3 && s[0] == 0xef && s[1] == 0xbb && s[2] == 0xbf {
        return s[3:]
    }
    return s
}

Ceci méthode Reçoit un paramètre de tableau d'octets et renvoie un nouveau tableau d'octets avec les caractères de nomenclature supprimés. Si le caractère BOM n'existe pas dans le tableau d'octets du paramètre, cette méthode renverra directement le tableau d'octets d'origine.

Ce qui suit est un exemple spécifique :

package main

import (
    "bytes"
    "fmt"
)

func main() {
    str := "\ufeffHello World"
    b := []byte(str)

    // 去除BOM字符
    b = bytes.TrimPrefix(b, []byte{0xef, 0xbb, 0xbf})
    str = string(b)

    fmt.Println(str)
}

Le résultat de sortie est :

Hello World

Dans cet exemple, nous utilisons la méthode TrimPrefix dans les octets library Supprimer les caractères de la nomenclature. Cette méthode reçoit deux paramètres. Le premier paramètre est le tableau d'octets à traiter et le deuxième paramètre est le préfixe à supprimer. Puisque le codage UTF-8 du caractère BOM est 0xefbbbf, nous supprimons le caractère BOM en passant []byte{0xef, 0xbb, 0xbf} comme deuxième paramètre. Enfin, le tableau d'octets traité est converti en chaîne pour la sortie.

Il est à noter que lors de l'appel de la méthode TrimPrefix, vous devez utiliser le caractère BOM de type []byte comme paramètre.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn