Définir l'encodage de texte en PHP au lieu de mb_detect_encoding

Il existe plusieurs encodages de caractères de l'alphabet cyrillique.

Lors de la création de sites sur Internet, utilisez généralement:

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

Encodages plus populaires:

  • iso-8859-5
  • ibm866
  • mac-cyrillique

Ce n'est probablement pas toute la liste, ce sont les encodages que je rencontre souvent.

Parfois, il devient nécessaire de déterminer l'encodage du texte. Et en PHP, il y a même une fonction pour cela:

mb_detect_encoding 

Mais, comme l' a écrit m00t dans l'article Définir l'encodage de texte en PHP - Un aperçu des solutions existantes et un autre vélo
Bref, ça ne marche pas.
Après avoir lu les articles m00t, je n'ai pas été inspiré par sa méthode et j'ai trouvé cette solution: Déterminer l'encodage de texte en PHP et Python
Comme l'a dit m00t
encore des codes de caractères
J'ai testé la fonction de détermination de l'encodage par des codes de caractères, le résultat m'a satisfait et j'ai utilisé cette fonction pendant quelques années.

Récemment, j'ai décidé de réécrire le projet où j'ai utilisé cette fonction, j'ai trouvé un package prêt à l'emploi sur packagist.org cnpait / detect_encoding , dans lequel l'encodage est déterminé à l'aide de la méthode m00t

En même temps, le package spécifié a été installé plus de 1200 fois, ce qui signifie que ce n'est pas pour moi seul que la tâche de déterminer l'encodage du texte se pose périodiquement.

J'installerais ce paquet et me calmerais, mais j'ai décidé de "devenir confus".

En général, j'ai fait mon package: onnov / detect-encoding .

Comment l'utiliser est écrit dans README.md

Je vais écrire sur le test et la comparaison avec le package cnpait / detect_encoding .

Méthodologie de test


Prenez le gros texte: Tolstoï - Anna Karenina
Total - 1'701'480 caractères

On supprime tous les inutiles, on ne laisse que l'alphabet cyrillique:

 $text = preg_replace('/[^--]/ui', '', $text); 

Il restait 1'336'252 signes cyrilliques.

Dans la boucle, nous prenons une partie du texte (5, 15, 30, ... caractères), le convertissons en un encodage connu et essayons de déterminer l'encodage par le script. Comparez ensuite correctement ou non.

Voici le tableau dans lequel l'encodage est à gauche, le nombre de caractères par lesquels l'encodage est déterminé en haut, le tableau montre le résultat de fiabilité en %%
lettres ->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-cyrillique12,7947,4973,4892,1599,3099,94100,0

Pire précision avec Mac Cyrillic, vous avez besoin d'au moins 60 caractères pour déterminer cet encodage avec une précision de 92,15%. L'encodage Windows-1251 a également une très faible précision. Cela est dû au fait que les nombres de leurs caractères dans les tableaux se chevauchent considérablement.

Heureusement, les encodages mac-cyrillic et ibm866 ne sont pas utilisés pour encoder les pages Web.

Essayons sans eux:
lettres ->510153060
windows-125199,4099,6999,8699,97100,0
koi8-r99,8999,9899,98100,0100,0
iso-8859-581,7996,4199,2799,98100,0

La précision de la détermination est élevée même dans des phrases courtes de 5 à 10 lettres. Et pour les phrases de 60 lettres, la précision de la détermination atteint 100%. Et pourtant, l'encodage est déterminé très rapidement, par exemple, le texte de plus de 1 300 000 caractères cyrilliques est vérifié en 0,00096 seconde. (sur mon ordinateur)

Et quels résultats la méthode statistique décrite par m00t montrera :
lettres ->510153060
windows-125188,7596,6298,4399,90100,0
koi8-r85.1595,7197,9699,91100,0
iso-8859-588.6096,7798,5899,93100,0

Comme vous pouvez le voir, les résultats de la détermination de l'encodage sont bons. La vitesse du script est élevée, en particulier dans les textes courts, dans les textes énormes, la vitesse est nettement inférieure. Le texte de plus de 1 300 000 caractères cyrilliques est vérifié en 0,32 seconde. (sur mon ordinateur).

Mes découvertes


  • Les deux méthodes donnent de bons résultats.
  • La précision des méthodes est proche.
  • La vitesse de détermination par codes de caractères est plus élevée dans les grands textes, mais cela n'a guère d'importance, car il est peu probable que quiconque vérifie de si gros textes.
  • La méthode statistique a encore le potentiel d'augmenter la précision de la détermination du codage.

La méthode à utiliser dépend de vous. En principe, vous pouvez utiliser les deux à la fois.

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


All Articles