Existem várias codificações de caracteres do alfabeto cirílico.
Ao criar sites na Internet, geralmente use:
Codificações mais populares:
- iso-8859-5
- ibm866
- mac-cirílico
Esta provavelmente não é a lista completa, estas são as codificações que frequentemente encontro.
Às vezes, torna-se necessário determinar a codificação do texto. E no PHP existe até uma função para isso:
mb_detect_encoding
Porém, como
m00t escreveu no artigo
Definindo a codificação de texto em PHP - uma visão geral das soluções existentes e outra bicicletaEm suma, não funciona.
Depois de ler os artigos do
m00t, não fiquei inspirado por seu método e encontrei esta solução:
Determinando a codificação de texto em PHP e PythonComo
m00t disse
novamente códigos de caracteres
Testei a função de determinar a codificação por códigos de caracteres, o resultado me satisfez e usei essa função por alguns anos.
Recentemente, decidi reescrever o projeto em que usei essa função, encontrei um pacote pronto em packagist.org
cnpait / detect_encoding , no qual a codificação é determinada usando o método
m00tAo mesmo tempo, o pacote especificado foi instalado mais de 1200 vezes, o que significa que não é somente para mim que surge a tarefa de determinar a codificação de texto periodicamente.
Eu instalaria este pacote e me acalmaria, mas decidi "ficar confuso".
Em geral, eu fiz o meu pacote:
onnov / detect-encoding .
Como usá-lo está escrito em README.md
Escreverei sobre testá-lo e compará-lo com o pacote
cnpait / detect_encoding .
Metodologia de teste
Veja o texto grande: Tolstoi - Anna Karenina
Total - 1'701'480 caracteres
Removemos tudo desnecessário, deixamos apenas o alfabeto cirílico:
$text = preg_replace('/[^--]/ui', '', $text);
Restavam 1'336'252 sinais cirílicos.
No loop, tomamos parte do texto (5, 15, 30, ... caracteres), convertemos para uma codificação conhecida e tentamos determinar a codificação pelo script. Então compare corretamente ou não.
Aqui está a tabela na qual a codificação está à esquerda, o número de caracteres pelos quais a codificação é determinada na parte superior, a tabela mostra o resultado da confiabilidade em %%
Com a menor precisão no Mac cirílico, você precisa de pelo menos 60 caracteres para determinar essa codificação com uma precisão de 92,15%. A codificação Windows-1251 também tem uma precisão muito baixa. Isso se deve ao fato de os números de seus caracteres nas tabelas se sobreporem bastante.
Felizmente, as codificações mac-cirílico e ibm866 não são usadas para codificar páginas da web.
Vamos tentar sem eles:
A precisão da determinação é alta, mesmo em frases curtas de 5 a 10 letras. E para frases de 60 letras, a precisão da determinação chega a 100%. E, no entanto, a codificação é determinada muito rapidamente, por exemplo, texto com mais de 1.300.000 caracteres cirílicos é verificado em 0,00096 segundos. (no meu computador)
E que resultados o método estatístico descrito por
m00t mostra :
Como você pode ver, os resultados da determinação da codificação são bons. A velocidade do script é alta, especialmente em textos curtos, em textos enormes a velocidade é significativamente inferior. O texto com mais de 1.300.000 caracteres cirílicos é verificado em 0,32 segundos. (no meu computador).
Minhas descobertas
- Ambos os métodos dão bons resultados.
- A precisão dos métodos está próxima.
- A velocidade de determinação por códigos de caracteres é maior em textos grandes, mas isso dificilmente é de grande importância, porque é improvável que alguém verifique textos tão grandes.
- O método estatístico ainda tem o potencial de aumentar a precisão da determinação da codificação.
Qual método usar depende de você. Em princípio, você pode usar os dois ao mesmo tempo.