Como posso obter o número de caracteres de uma string no Go?
Por exemplo, se eu tiver uma string, "hello"
o método retornará 5
. Eu vi que len(str)
retorna o número de bytes e não o número de caracteres, então len("£")
retorna 2 em vez de 1 porque £ é codificado com dois bytes em UTF-8.
string
go
character
string-length
Ammar
fonte
fonte
Respostas:
Você pode tentar
RuneCountInString
no pacote utf8.que, conforme ilustrado neste script : o comprimento do "Mundo" pode ser 6 (quando escrito em chinês: "世界"), mas sua contagem de runas é 2:
Phrozen acrescenta nos comentários :
Na verdade, você pode fazer
len()
sobre runas apenas digitando casting.len([]rune("世界"))
irá imprimir2
. No pulo no Go 1.3.E com o CL 108985 (maio de 2018, para Go 1.11),
len([]rune(string))
agora está otimizado. (Conserta problema 24923 )O compilador detecta o
len([]rune(string))
padrão automaticamente e o substitui pela chamada r: = range s.Stefan Steiger aponta para a postagem do blog " Normalização de texto no Go "
O que é um personagem?
Usando esse pacote e seu
Iter
tipo , o número real de "caractere" seria:Aqui, isso usa o formulário de Normalização Unicode NFKD "Decomposição de Compatibilidade"
A resposta de Oliver aponta para SEGMENTAÇÃO DE TEXTO UNICODE como a única maneira de determinar com segurança os limites padrão entre certos elementos significativos do texto: caracteres, palavras e frases percebidos pelo usuário.
Para isso, você precisa de uma biblioteca externa como o rivo / uniseg , que faz a Segmentação de Texto Unicode .
Na verdade, isso contará " cluster grafema ", onde vários pontos de código podem ser combinados em um caractere percebido pelo usuário.
Dois grafemas, embora existam três runas (pontos de código Unicode).
Você pode ver outros exemplos em " Como manipular seqüências de caracteres no GO para revertê-las? "
👩🏾🦰 sozinho é um grafema, mas, de unicode para conversor de pontos de código , 4 runas:
fonte
Existe uma maneira de obter a contagem de runas sem nenhum pacote, convertendo string para [] rune como
len([]rune(YOUR_STRING))
:fonte
Depende muito da sua definição do que é um "personagem". Se "runa é igual a um personagem" está OK para a sua tarefa (geralmente não é), então a resposta do VonC é perfeita para você. Caso contrário, deve-se notar provavelmente que existem poucas situações em que o número de runas em uma string Unicode é um valor interessante. E mesmo nessas situações, é melhor, se possível, inferir a contagem enquanto "percorre" a cadeia enquanto as runas são processadas para evitar duplicar o esforço de decodificação UTF-8.
fonte
String
o.length()
método de Java também não retorna o número de caracteres. Nem Cacau doNSString
's-length
método. Aqueles simplesmente retornam o número de entidades UTF-16. Mas o número real de pontos de código raramente é usado, porque leva um tempo linear para contá-lo.Se você precisar levar em consideração os clusters de grafema, use o módulo regexp ou unicode. Contar o número de pontos de código (runas) ou bytes também é necessário para validação, uma vez que o comprimento do cluster grafema é ilimitado. Se você deseja eliminar sequências extremamente longas, verifique se as sequências estão em conformidade com o formato de texto seguro para fluxo .
fonte
var
fora das funções.Existem várias maneiras de obter um comprimento de string:
fonte
Devo salientar que nenhuma das respostas fornecidas até o momento fornece o número de caracteres esperado, especialmente quando você lida com emojis (mas também com alguns idiomas como tailandês, coreano ou árabe). As sugestões do VonC produzirão o seguinte:
Isso ocorre porque esses métodos contam apenas pontos de código Unicode. Existem muitos caracteres que podem ser compostos de vários pontos de código.
O mesmo para usar o pacote de normalização :
Normalização não é realmente o mesmo que contar caracteres e muitos caracteres não podem ser normalizados no equivalente a um ponto de código.
A resposta da masakielastic chega perto, mas apenas lida com modificadores (a bandeira do arco-íris contém um modificador que, portanto, não é contado como seu próprio ponto de código):
A maneira correta de dividir seqüências de caracteres Unicode em caracteres (percebidos pelo usuário), ou seja, grupos de grafemas, é definida no Anexo Padrão 29 da Unicode . As regras podem ser encontradas na Seção 3.1.1 . O pacote github.com/rivo/uniseg implementa essas regras para que você possa determinar o número correto de caracteres em uma string:
fonte
Eu tentei fazer a normalização um pouco mais rápido:
fonte