Cómo obtener la cantidad de caracteres (runas) en un string de Go, no bytes
¿Por qué len() cuenta bytes y no caracteres?
En Go, los strings son secuencias inmutables de bytes. La función len() devuelve la cantidad de bytes, no de caracteres. Cuando usas caracteres cirílicos como "пароль", cada letra ocupa 2 bytes en UTF-8, por lo que len("пароль") devuelve 12 (6 letras × 2 bytes cada una).
Solución: usar el paquete unicode/utf8
Para contar correctamente los caracteres (runas) en un string, debes usar la función utf8.RuneCountInString() del paquete estándar unicode/utf8:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
password := "пароль"
if utf8.RuneCountInString(password) < 8 {
fmt.Println("La contraseña es demasiado corta")
} else {
fmt.Println("Contraseña válida")
}
}
También puedes convertir a []rune
Otra forma común es convertir el string a un slice de runas:
package main
import "fmt"
func main() {
password := "пароль😀"
runas := []rune(password)
if len(runas) < 8 {
fmt.Println("La contraseña es demasiado corta")
} else {
fmt.Println("Contraseña válida")
}
}
Este método muestra que []rune(password) trata correctamente cada carácter Unicode (incluyendo emojis como 😀) como un elemento separado.
Conclusión
Para trabajar con strings que contienen Unicode (cirílico, emojis, etc.) en Go:
- NO uses
len()para contar caracteres - Usa
utf8.RuneCountInString()o convierte a[]rune - Considera que cada runa puede ocupar 1-4 bytes en UTF-8
El paquete unicode/utf8 y el tipo rune son tus aliados para manejo correcto de texto Unicode en Go.
Tags: strings, runas, longitud de string, unicode, go