12
votes

Comment puis-je dire DomDocument-> Charger () quel encodage je veux qu'il soit utilisé?

Je recherche et traite des fichiers XML d'ailleurs et besoin de transformez-les avec des xslts. Aucun problème. En utilisant php5 et le dom Bibliothèque, tout est un snap. Travaillé bien, jusqu'à maintenant. Aujourd'hui, funky les caractères étaient dans le fichier XML - "Smart" citations de Word, il a l'air aimer. Quoi qu'il en soit, Domdocument-> Charge se plaignait d'eux, en disant que Ils n'étaient pas UTF-8 et de spécifier le codage.

lo et voici, l'encodage n'est pas spécifié dans ces fichiers XML. Si je Ajouter in 'codage = "ISO-8859-1"' à l'en-tête, ça marche bien. Le frottement est Je n'ai aucun contrôle sur ces fichiers XML.

lire le fichier dans une chaîne, modifier son en-tête et écrire à un autre endroit semble être ma seule option, mais je préférerais faire Il sans avoir à utiliser des copies temporaires des fichiers XML du tout. Est là-bas de dire simplement à l'analyseur de les analyser comme s'ils étaient ISO-8859-1?


0 commentaires

3 Réponses :


10
votes

Est-ce que cela fonctionne pour vous?

$myXMLString = file_get_contents($xmlPath);
$myXMLString = utf8_decode($myXMLString);
$doc = new DOMDocument('1.0', 'iso-8859-1');
$doc->loadXML($myXMLString);


1 commentaires

Essayé cela - il ne semble pas affecter le document chargé - de ma lecture, je suis à peu près sûr que le codage est réinitialisé par l'appel de charge ()



5
votes

Je n'ai pas trouvé de moyen de définir le codage par défaut (encore) mais peut-être Le mode récupération est réalisable dans ce cas.
Lorsque LibXML rencontre une erreur de codage et aucun encodage n'a été défini explicitement des commutateurs d'UNICODE / UTF8 en latin1 et continue à analyser le document. Mais dans le contexte d'analyseur, la propriété forcée est défini sur 0 / false. L'extension DOM de PHP considère que le document valide si forcé est vrai ou l'attribut de l'objet DOMDocument Récupérer est vrai. xxx

impression xxx

Vous obtenez toujours le message d'avertissement (qui peut être supprimé avec @ $ doc-> charge ()) et il apparaîtra également dans le erreurs internes libxml (une seule fois lorsque l'analyseur passe de l'UTF8 en latin1). Le code d'erreur pour cette erreur particulière sera de 9 (xml_err_invalid_char). xxx


0 commentaires

2
votes

Le seul moyen de spécifier le codage est dans la déclaration XML au début du fichier:

<?xml version="1.0" encoding="ISO-8859-1"?>


1 commentaires

C'est la seule réponse correcte - voir aussi Stackoverflow.com/Questions/8218230/...