¿Cómo obtener el número de caracteres en una cadena?


¿Cómo puedo obtener el número de caracteres de una cadena en Go?

Por ejemplo, si tengo una cadena "hello" el método debería devolver 5. Vi que len(str)devuelve el número de bytes y no el número de caracteres por lo que len("£") devuelve 2 en lugar de 1 porque £ está codificado con dos bytes en UTF-8.

Author: Sam Whited, 0000-00-00

1 answers

Puedes probar RuneCountInString del paquete utf8.

Devuelve el número de runas en p

Que, como se ilustra en esta escritura : la longitud de "Mundo" podría ser 6 (cuando se escribe en chino: "世界"), pero su recuento de runas es 2:

package main

import "fmt"
import "unicode/utf8"

func main() {
    fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界"))
}

Phrozen agrega en los comentarios:

En realidad puedes hacer len() sobre runas simplemente escribiendo casting.
len([]rune("世界")) se imprimirá 2. Al menos en Go 1.3.


Y con CL 108985 (mayo de 2018, para Go 1.11), len([]rune(string)) ahora está optimizado. (Soluciona el problema 24923)

El compilador detecta len([]rune(string)) pattern automáticamente, y lo reemplaza con for r := range s call.

Agrega una nueva función de tiempo de ejecución para contar runas en una cadena. Modifica el compilador para detectar el patrón len([]rune(string)) y lo reemplaza con la nueva función rune counting runtime.

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 apunta a la entrada del blog "Normalización de texto en Go "

¿Qué es un personaje?

Como se mencionó en la entrada del blog de cadenas, los caracteres pueden abarcar varias runas .
Por ejemplo, un ' e' y ' ◌ ◌ ' (agudo "\u0301") pueden combinarse para formar 'é' ("e\u0301" en NFD). Juntas estas dos runas son un carácter .

La definición de un carácter puede variar dependiendo de la aplicación.
Para normalización nosotros lo definirá como:

  • una secuencia de runas que comienza con un arrancador,
  • una runa que no modifica o combina hacia atrás con ninguna otra runa, {[75]]}
  • seguido de una secuencia posiblemente vacía de no iniciadores, es decir, runas que sí lo hacen (típicamente acentos).

El algoritmo de normalización procesa un carácter a la vez.

Usando ese paquete y su Iter tipo, el número real de "carácter" sería be:

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)
}

Aquí, esto usa la forma de normalización Unicode NFKD"Compatibility Decomposition"

 115
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61