Definindo codificação de texto no PHP em vez de mb_detect_encoding

Existem várias codificações de caracteres do alfabeto cirílico.

Ao criar sites na Internet, geralmente use:

  • utf-8
  • windows-1251
  • koi8-r

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 bicicleta
Em 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 Python
Como 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 m00t

Ao 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 %%
letras ->5153060120180270
windows-125199,1398,8398,5499,0499,7399,93100,0
koi8-r99,8999,98100,0100,0100,0100,0100,0
iso-8859-581,7999,2799,98100,0100,0100,0100,0
ibm86699,8199,99100,0100,0100,0100,0100,0
mac-cirílico12,7947,4973,4892,1599,3099,94100,0

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:
letras ->510153060
windows-125199,4099,6999,8699,97100,0
koi8-r99,8999,9899,98100,0100,0
iso-8859-581,7996,4199,2799,98100,0

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 :
letras ->510153060
windows-125188,7596,6298,4399,90100,0
koi8-r85,1595,7197,9699,91100,0
iso-8859-588,6096,7798,5899,93100,0

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.

Source: https://habr.com/ru/post/pt466113/


All Articles