Comment puis-je obtenir le nombre de caractères d'une chaîne dans Go?
Par exemple, si j'ai une chaîne, "hello"
la méthode doit retourner 5
. J'ai vu que cela len(str)
renvoie le nombre d'octets et non le nombre de caractères, donc len("£")
renvoie 2 au lieu de 1 car £ est codé avec deux octets en UTF-8.
string
go
character
string-length
Ammar
la source
la source
Réponses:
Vous pouvez essayer à
RuneCountInString
partir du package utf8.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:
Phrozen ajoute dans les commentaires :
En fait, vous pouvez faire
len()
plus de runes en tapant simplement.len([]rune("世界"))
imprimera2
. 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.Stefan Steiger pointe vers le billet de blog " Normalisation du texte en Go "
Qu'est-ce qu'un personnage?
En utilisant ce package et son
Iter
type , le nombre réel de "caractère" serait: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.
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:
la source
Il existe un moyen d'obtenir le nombre de runes sans aucun paquet en convertissant la chaîne en [] rune comme suit
len([]rune(YOUR_STRING))
:la source
Cela dépend beaucoup de votre définition de ce qu'est un «personnage». Si "rune est égal à un personnage" est OK pour votre tâche (ce n'est généralement pas le cas) alors la réponse de VonC est parfaite pour vous. Sinon, il convient probablement de noter qu'il y a peu de situations où le nombre de runes dans une chaîne Unicode est une valeur intéressante. Et même dans ces situations, il est préférable, si possible, de déduire le décompte tout en "parcourant" la chaîne pendant que les runes sont traitées pour éviter de doubler l'effort de décodage UTF-8.
la source
String
la.length()
méthode de Java ne renvoie pas non plus le nombre de caractères. Ni ne de cacaoNSString
de-length
méthode. Ceux-ci renvoient simplement le nombre d'entités UTF-16. Mais le nombre réel de points de code est rarement utilisé, car il faut un temps linéaire pour le compter.Si vous devez prendre en compte les clusters de graphèmes, utilisez le module regexp ou unicode. Le comptage du nombre de points de code (runes) ou d'octets est également nécessaire pour la validation car la longueur du cluster de graphèmes est illimitée. Si vous souhaitez éliminer les séquences extrêmement longues, vérifiez si les séquences sont conformes au format de texte sécurisé par flux .
la source
var
dehors des fonctions.Il existe plusieurs façons d'obtenir une longueur de chaîne:
la source
Je dois souligner qu'aucune des réponses fournies jusqu'à présent ne vous donne le nombre de caractères que vous attendez, en particulier lorsque vous avez affaire à des emojis (mais aussi à certaines langues comme le thaï, le coréen ou l'arabe). Les suggestions de VonC produiront les éléments suivants:
C'est parce que ces méthodes ne comptent que les points de code Unicode. Il existe de nombreux caractères qui peuvent être composés de plusieurs points de code.
Idem pour l'utilisation du package de normalisation :
La normalisation n'est pas vraiment la même chose que le comptage des caractères et de nombreux caractères ne peuvent pas être normalisés en un équivalent à un point de code.
La réponse de masakielastic se rapproche mais ne gère que les modificateurs (le drapeau arc-en-ciel contient un modificateur qui n'est donc pas compté comme son propre point de code):
La manière correcte de diviser les chaînes Unicode en caractères (perçus par l'utilisateur), c'est-à-dire en grappes de graphèmes, est définie dans l' Annexe 29 de la norme Unicode . Les règles se trouvent dans la section 3.1.1 . Le package github.com/rivo/uniseg implémente ces règles afin que vous puissiez déterminer le nombre correct de caractères dans une chaîne:
la source
J'ai essayé de faire la normalisation un peu plus vite:
la source