PHP: Convertir la sortie curl_exec en UTF8
Je voudrais travailler uniquement avec l'UTF8. Le problème est que je ne sais pas le jeu de caractères de chaque page. Comment puis-je le détecter et de le convertir en UTF8?
<?php
$url = "http://vkontakte.ru";
$ch = curl_init($url);
$options = array(
CURLOPT_RETURNTRANSFER => true,
);
curl_setopt_array($ch, $options);
$data = curl_exec($ch);
//$data = magic($data);
print $data;
Voir ce à: http://paulisageek.com/tmp/curl-utf8
Qu'est-ce que magic()
?
source d'informationauteur Paul Tarjan
Vous devez vous connecter pour publier un commentaire.
En passant par Gumbo et Pekka les conseils, j'ai écrit
curl_exec_utf8
Les regexes sont pour la plupart de http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_content_type
La conversion est facile. La détection est la partie la plus difficile. Vous pouvez essayer de mb_detect_encoding mais qui est très fragile méthode, c'est littéralement de "deviner" le type de contenu et que @troelskn faits saillants dans les commentaires, on peut deviner "bruts" des différences au mieux (Est-ce un encodage multi-octet?) mais ne parvient pas à détecter les nuances de similaires jeux de caractères.
La bonne façon serait de l'OMI:
content-type
balises Meta dans la pagecontent-type
en-têtes envoyés par le serveurDifférents que décrite dans les directives de la @Gumbo réponse, personnellement, je pense que les balises Meta doivent avoir la priorité sur les serveur les en-têtes de parce que je suis assez sûr que, si une balise Meta est présent, qui est un indicateur plus fiable de l'encodage de la page qu'un serveur à la définition de certains opérateurs du site ne savons même pas comment changer. La manière correcte, cependant, semble être à traiter-têtes content-type avec une priorité plus élevée.
Pour les anciens, je pense que vous pouvez utiliser get_meta_tags(). Ce dernier vous devriez l'obtenir à partir d'curl déjà, vous devez l'analyser. Ici est un exemple complet sur la façon de systématiquement processus en-têtes de réponse servi par cURL.
La conversion serait alors à l'aide de iconv:
J'ai été très heureux de trouver cette réponse, mais il a remarqué il y a un défaut dans le
<meta>
balise de détection. Il n'a tout simplement semblent pas correspondre à tout type de contenu des balises, et il n'est pas encore équipé pour le nouveau HTML5 style tags:<meta charset="UTF-8">
. Alors j'ai écrit ça, j'espère qu'elle vous aide à vous les gars, et merci encore pour cette excellente solution!(P. S. je ne pouvais pas comprendre comment le poste comme un commentaire, comme il n'est évidemment pas une réponse complète.)
Vous pouvez essayer et utiliser quelque chose comme:
http://www.php.net/manual/en/function.mb-detect-encoding.php
http://www.php.net/manual/en/function.mb-convert-encoding.php
Bien que ce n'est pas indéréglable.
Il y a un ordre défini comment spécifier le codage des caractères en HTML:
Si pas de caractère de déclaration de codage est présent, HTTP définit le jeu de caractères ISO 8859-1 comme codage de caractères par défaut. Vous pouvez soit l'utiliser comme codage de caractères par défaut pour le code HTML de trop ou tout simplement refuser de traiter la réponse.
Pour XHTML, vous en outre avoir les Déclaration XML comme source pour l'encodage:
Si pas de caractère de déclaration de codage, XML définit UTF-8 et UTF-16 dans le codage de caractères par défaut:
Donc, pour résumer, la commande est:
encoding
attribut.META
déclaration "http-equiv" set "Content-Type" et une valeur définie pour "charset".Si pas de caractère de déclaration de codage est présent, on peut supposer que la norme ISO 8859-1 comme encodage par défaut pour le code HTML et doit assumer UTF-8 ou UTF-16 comme encodage par défaut pour le XHTML.