Avatar ·

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