PHP: Convertir une chaîne en UTF-8 sans connaître l'original jeu de caractères, ou au moins essayer

J'ai une application qui traite avec des clients de partout dans le monde, et, naturellement, je veux tout ce qui se passe dans mes bases de données pour être codé en UTF-8.

Le principal problème pour moi est que je ne sais pas ce que le codage de la source de n'importe quelle chaîne va être - c'est peut-être à partir d'une zone de texte (à l'aide de <form accept-charset="utf-8"> n'est utile que si l'utilisateur est soumis le formulaire), ou il pourrait être téléchargés à partir d'un fichier texte, donc je n'ai pas vraiment de contrôle sur l'entrée.

Ce dont j'ai besoin est une fonction ou une classe qui fait en sorte que les choses qui se passent dans ma base de données est, dans la mesure du possible, codé en UTF-8. J'ai essayé iconv(mb_detect_encoding($text), "UTF-8", $text);
mais qui a des problèmes (si l'entrée est 'fiancée' il renvoie 'fiancé'). J'en ai essayé beaucoup de choses =/

Pour les uploads de fichier, j'aime l'idée de demander à l'utilisateur de préciser l'encodage qu'ils utilisent, et de leur montrer les aperçus de ce que la sortie va ressembler, mais ce n'aide pas contre les méchants pirates (en fait, on pourrait leur rendre la vie un peu plus facile).

J'ai lu les autres questions sur le sujet, mais ils semblent tous avoir des différences subtiles comme "j'ai besoin d'analyser les flux RSS" ou "je gratter les données de sites web" (ou, en fait, "on ne peut pas").

Mais il doit y avoir quelque chose qui au moins a une bonne essayer!

  • En gros, c'est pas possible, par définition, pour obtenir tout à fait correcte, en réalité, le taux de réussite de deviner un inconnu l'encodage n'est pas terrible. Il est possible d'utiliser la méthode heuristique, mais il sera correct à moins de 100% du temps, en fonction du matériau de loin inférieur à 100%. Vous devez être conscient de cela. Peut-être que quelqu'un ici peut au moins suggérer une bibliothèque avec de bonnes heuristiques, cependant.
  • Bien sûr, je sais il n'y a pas de solution parfaite, d'où le désir de quelque chose qui aura au moins un de bien aller.
  • cela peut vous aider: stackoverflow.com/q/505562/642173
  • Avez-vous essayé d'utiliser UTF-8//IGNORE que le 2ème param dans iconv?
  • Ouais, c'est ce que j'ai fait. Il n'est pas parfait, évidemment, que puis "fiancée" devient "fiancé", mais c'est certainement mieux. Comment se fait-TRANSLIT ne fonctionne pas?
  • N'est-il pas plus facile de DEMANDER les clients de la langue source (aka localisation)? Vous permet d'économiser des maux de tête dans le long terme.
  • Bien sûr, une partie du problème est que les non-anglais des mots des cultures dans le texte anglais assez fréquemment (par exemple 'fiancée'), et le même problème se produit avec d'autres langues aussi - je me souviens quand j'étais à l'école, il y avait un mouvement en France pour purger des phrases comme "le week-end'.
  • double possible de Détecter l'encodage et de faire tout en UTF-8
  • J'ai fait une contribution visant à celles qui tentent de résoudre ce principalement avec mb_* fonctions. Il est une sorte de sauvage, mais bon, pourquoi pas? 🙂 Si il y avait un moyen de se débarrasser de utf8_decode et utf8_encode, il pourrait être mieux. Peut-être iconv???
  • J'ai trouvé ce stackoverflow.com/a/3521396/1429677 une excellente réponse à cette question, ici, est la lib github.com/neitanod/forceutf8
  • mon commentaire à compter de 2019, de valider et d'accepter l'entrée d'une codé en utf-8 page dans utf8mb4 db comme il est avec des déclarations préparées à l'avance et de prendre vos précautions lors de l'impression à l'écran. ce sera en sécurité et toujours lisible sans avoir besoin de ce qui est demandé.

InformationsquelleAutor Grim... | 2011-11-02