¿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 volver 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.
string
go
character
string-length
Ammar
fuente
fuente
Respuestas:
Puedes probar
RuneCountInString
desde el paquete utf8.que, como se ilustra en este script : la longitud de "Mundo" podría ser 6 (cuando se escribe en chino: "世界"), pero su número de runas es 2:
Phrozen agrega en los comentarios :
En realidad, puedes
len()
superar las runas con solo escribir casting.len([]rune("世界"))
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 el
len([]rune(string))
patrón automáticamente y lo reemplaza por r: = llamada de rango.Stefan Steiger señala la publicación del blog " Normalización de texto en Go "
¿Qué es un personaje?
Usando ese paquete y su
Iter
tipo , el número real de "carácter" sería:Aquí, esto usa el formulario de normalización Unicode NFKD "Descomposición de compatibilidad"
La respuesta de Oliver apunta a la SEGMENTACIÓN DE TEXTO UNICODE como la única forma de determinar de manera confiable los límites predeterminados entre ciertos elementos de texto significativos: caracteres percibidos por el usuario, palabras y oraciones.
Para eso, necesita una biblioteca externa como rivo / uniseg , que realiza la segmentación de texto Unicode .
Eso contará realmente " grupo de grafemas ", donde se pueden combinar múltiples puntos de código en un carácter percibido por el usuario.
Dos grafemas, aunque hay tres runas (puntos de código Unicode).
Puede ver otros ejemplos en " ¿Cómo manipular cadenas en GO para revertirlas? "
👩🏾🦰 solo es un grafema, pero, de unicode a convertidor de puntos de código , 4 runas:
fuente
Hay una manera de obtener el recuento de runas sin ningún paquete convirtiendo la cadena en [] runas como
len([]rune(YOUR_STRING))
:fuente
Depende mucho de tu definición de lo que es un "personaje". Si "runa es igual a un personaje" está bien para su tarea (generalmente no lo es), entonces la respuesta de VonC es perfecta para usted. De lo contrario, probablemente debería notarse que hay pocas situaciones en las que el número de runas en una cadena Unicode es un valor interesante. E incluso en esas situaciones es mejor, si es posible, inferir el recuento mientras "atraviesa" la cadena a medida que se procesan las runas para evitar duplicar el esfuerzo de decodificación UTF-8.
fuente
String
el.length()
método de Java tampoco devuelve el número de caracteres. Tampoco lo hace Cacao deNSString
's-length
método. Esos simplemente devuelven el número de entidades UTF-16. Pero el número verdadero de puntos de código rara vez se usa, porque se necesita tiempo lineal para contarlo.Si necesita tener en cuenta los grupos de grafemas, use regexp o unicode module. También es necesario contar la cantidad de puntos de código (runas) o bytes para la validación, ya que la longitud del grupo de grafemas es ilimitada. Si desea eliminar secuencias extremadamente largas, verifique si las secuencias se ajustan al formato de texto seguro para la transmisión .
fuente
var
fuera de las funciones.Hay varias formas de obtener una longitud de cadena:
fuente
Debo señalar que ninguna de las respuestas proporcionadas hasta el momento le da la cantidad de caracteres que esperaría, especialmente cuando se trata de emojis (pero también algunos idiomas como tailandés, coreano o árabe). Las sugerencias de VonC generarán lo siguiente:
Esto se debe a que estos métodos solo cuentan puntos de código Unicode. Hay muchos caracteres que pueden estar compuestos de múltiples puntos de código.
Lo mismo para usar el paquete de Normalización :
La normalización no es realmente lo mismo que contar caracteres y muchos caracteres no se pueden normalizar en un equivalente de un punto de código.
La respuesta de masakielastic se acerca pero solo maneja modificadores (la bandera del arco iris contiene un modificador que por lo tanto no se cuenta como su propio punto de código):
La forma correcta de dividir las cadenas Unicode en caracteres (percibidos por el usuario), es decir, grupos de grafemas, se define en el Anexo estándar 29 de Unicode . Las reglas se pueden encontrar en la Sección 3.1.1 . El paquete github.com/rivo/uniseg implementa estas reglas para que pueda determinar el número correcto de caracteres en una cadena:
fuente
Traté de hacer la normalización un poco más rápido:
fuente