Strlen não retornando o comprimento da corda correta

votos
1

Eu tenho uma string com este conteúdo:

$myString = 'Câmara de Dirigentes Lojistas';

Essa seqüência tem 29 caracteres. Mas quando eu chamo strlen, que retorna 30! Mesmo quando eu chamo var_dump($myString), que é o resultado:

114:string 'Câmara de Dirigentes Lojistas' (length=30)

O que está acontecendo aqui ? Talvez o problema está relacionado com o caractere especial â?

Publicado 27/11/2018 em 18:08
fonte usuário
Em outras línguas...                            


4 respostas

votos
4

Esse é o comportamento correto desde que você está usando codificação UTF-8.

Por favor, veja esta nota na strlen()documentação

Nota:

strlen () retorna o número de bytes em vez do número de caracteres de uma cadeia.

Como a cadeia tem caracteres multi-byte (A), PHP usa dois bytes para representá-la.

Para ter o comprimento da corda direita, você deve usar a mb_strlen()função:

mb_strlen("â"); // 1

strlen("â");    // 2
Respondeu 27/11/2018 em 18:15
fonte usuário

votos
3

Existem várias definições do "comprimento" de uma string, porque há uma variedade de truques usados ​​para representar a enorme gama de caracteres acentuados, variantes e scripts não-alfabéticos utilizados em todo o mundo.

  • O número de bytes da string ocupa. Este é o mais fácil de calcular, mas nem sempre o que se espera. Por exemplo, em UTF-16, cada ponto de código leva-se 2 ou 4 bytes; em UTF-8, pontos de código tomar-se 1, 2, 3, ou 4 bytes. Isto é o que strlene funções maioria PHP trabalhar.
  • O número de "pontos de código": símbolos separados no conjunto de caracteres. Este é o próximo mais fácil, eo próximo mais comum, mas é geralmente um compromisso entre bytes e "grafemas" (veja abaixo) - não há muitos casos em que é particularmente útil para contar écomo 2 "personagens" só porque ele é representado com uma combinação diacrítico. No PHP você pode usar mb_strlenpara contar estes, dizendo que a codificação de caracteres do seu string.
  • O número de "grafemas": símbolos separados um leitor reconheceria. Este é o significado mais intuitiva, mas o mais difícil para um computador para definir. No PHP você pode usar grapheme_strlen, enquanto você ter garantido sua string é codificado como UTF-8.
Respondeu 27/11/2018 em 18:48
fonte usuário

votos
1

Há um problema com o personagem â, pois é um caractere especial que usa uma codificação diferente. Caracteres como este são personagens realmente duplas É por isso que a sua dando 30 e não 29

Para corrigir isso, você precisa usar mb_strlen()com codificação

$myString = 'Câmara de Dirigentes Lojistas';

echo mb_strlen($myString,'utf8')

NOTA : Se mb_strlennão estiver definida, então você terá que habilitar mbextensão em suas configurações php

Respondeu 27/11/2018 em 18:18
fonte usuário

votos
-1

Curiosamente o âcaractere existe no ascii prolongado, isto é, pode ser representado por apenas um byte, você pode experimentá-lo com este código:

$str = utf8_decode('Câmara de Dirigentes Lojistas');
echo 'length is ' . strlen($str);

que a produção vontade length is 29.

Então, como você vê a coisa é que, quando um char não é ASCII (127 a tabela ASCII caractere), então PHP assume UTF-8 automaticamente.

Respondeu 27/11/2018 em 18:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more