Avatar ·

Comment obtenir le nombre de caractères (runes) dans une chaîne Go, et non d'octets ?

Pourquoi len() compte les octets et non les caractères ?

En Go, les chaînes sont des séquences immuables d'octets. La fonction len() retourne le nombre d'octets dans la chaîne, pas le nombre de caractères (runes). Pour les caractères ASCII, cela correspond au nombre de caractères, mais pour les caractères Unicode comme le cyrillique ou les emojis, chaque caractère peut occuper plusieurs octets.

Comment compter correctement les caractères ?

Pour compter les caractères réels (runes) dans une chaîne, utilisez le package unicode/utf8 :

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    password := "пароль"
    if utf8.RuneCountInString(password) < 8 {
        fmt.Println("Mot de passe trop court")
    } else {
        fmt.Println("Mot de passe valide")
    }
}

Vous pouvez également itérer sur les runes avec une boucle range, qui les décode automatiquement :

package main

import "fmt"

func main() {
    password := "пароль"
    count := 0
    for range password {
        count++
    }
    if count < 8 {
        fmt.Println("Mot de passe trop court")
    }
}

Faut-il prendre en compte Unicode pour le cyrillique ou les emojis ?

Oui, absolument ! Le package unicode/utf8 gère correctement le comptage des runes pour tous les caractères Unicode, y compris le cyrillique, les emojis, les accents, etc. Si vous utilisez len(), vous obtiendrez des résultats incorrects pour ces caractères, comme vous l'avez constaté.

Tags : chaînes, runes, longueur de chaîne, unicode, go