Vous pouvez essayer à RuneCountInString
partir du package utf8.
renvoie le nombre de runes en p
que, comme illustré dans ce script : la longueur de "World" peut être de 6 (lorsqu'il est écrit en chinois: "世界"), mais son nombre de runes est de 2:
package main
import "fmt"
import "unicode/utf8"
func main() {
fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界"))
}
Phrozen ajoute dans les commentaires :
En fait, vous pouvez faire len()
plus de runes en tapant simplement.
len([]rune("世界"))
imprimera 2
. Aux sauts dans Go 1.3.
Et avec CL 108985 (mai 2018, pour Go 1.11), len([]rune(string))
est maintenant optimisé. ( Résout le problème 24923 )
Le compilateur détecte len([]rune(string))
automatiquement le motif et le remplace par l'appel de for r: = range.
Ajoute une nouvelle fonction d'exécution pour compter les runes dans une chaîne. Modifie le compilateur pour détecter le modèle len([]rune(string))
et le remplace par la nouvelle fonction d'exécution de comptage de runes.
RuneCount/lenruneslice/ASCII 27.8ns ± 2% 14.5ns ± 3% -47.70% (p=0.000 n=10+10)
RuneCount/lenruneslice/Japanese 126ns ± 2% 60ns ± 2% -52.03% (p=0.000 n=10+10)
RuneCount/lenruneslice/MixedLength 104ns ± 2% 50ns ± 1% -51.71% (p=0.000 n=10+9)
Stefan Steiger pointe vers le billet de blog " Normalisation du texte en Go "
Qu'est-ce qu'un personnage?
Comme mentionné dans le billet de blog sur les chaînes , les personnages peuvent s'étendre sur plusieurs runes .
Par exemple, un ' e
' et un '◌́◌́' (aigu "\ u0301") peuvent se combiner pour former 'é' (" e\u0301
" dans NFD). Ensemble, ces deux runes forment un seul personnage .
La définition d'un caractère peut varier en fonction de l'application.
Pour la normalisation, nous le définirons comme:
- une séquence de runes qui commence par un démarreur,
- une rune qui ne modifie ni ne se combine à l'envers avec aucune autre rune,
- suivi d'une séquence éventuellement vide de non-démarreurs, c'est-à-dire de runes qui le font (généralement des accents).
L'algorithme de normalisation traite un caractère à la fois.
En utilisant ce package et son Iter
type , le nombre réel de "caractère" serait:
package main
import "fmt"
import "golang.org/x/text/unicode/norm"
func main() {
var ia norm.Iter
ia.InitString(norm.NFKD, "école")
nc := 0
for !ia.Done() {
nc = nc + 1
ia.Next()
}
fmt.Printf("Number of chars: %d\n", nc)
}
Ici, cela utilise le formulaire de normalisation Unicode NFKD "Décomposition de compatibilité"
Oliver de » réponse des points à UNICODE TEXTE SEGMENTATION que la seule façon de déterminer de manière fiable les limites par défaut entre certains éléments de texte significatifs: caractères perçus par l' utilisateur, des mots et des phrases.
Pour cela, vous avez besoin d'une bibliothèque externe comme rivo / uniseg , qui effectue la segmentation de texte Unicode .
Cela comptera en fait " grappe de graphèmes ", où plusieurs points de code peuvent être combinés en un seul caractère perçu par l'utilisateur.
package uniseg
import (
"fmt"
"github.com/rivo/uniseg"
)
func main() {
gr := uniseg.NewGraphemes("👍🏼!")
for gr.Next() {
fmt.Printf("%x ", gr.Runes())
}
// Output: [1f44d 1f3fc] [21]
}
Deux graphèmes, même s'il y a trois runes (points de code Unicode).
Vous pouvez voir d'autres exemples dans " Comment manipuler des chaînes dans GO pour les inverser? "
👩🏾🦰 seul est un graphème, mais, du convertisseur unicode en points de code , 4 runes: