XmlDocument.La méthode Load() ne réussit pas à décoder € (euro)
j'ai un document XML file.xml
qui est codé Iso-latin-15 (alias Iso-Latin-9)
<?xml version="1.0" encoding="iso-8859-15"?>
<root xmlns="http://stackoverflow.com/demo">
<f>€.txt</f>
</root>
de mon éditeur de texte préféré, je peux dire que ce fichier est correctement encodé en Iso-Latin-15 (Il n'est pas UTF-8).
Mon logiciel est écrit en C# et veut extraire l'élément f
.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("file.xml");
dans la vraie vie, j'ai un XMLResolver pour définir les références. Mais en gros, mon code est aussi simple que ça. Le chargement se passe bien, je n'ai pas d'exception soulevée.
maintenant, mon problème quand j'extrait la valeur:
//xnsm is the XmlNameSpace manager
XmlNode n = xmlDoc.SelectSingleNode("//root/f", xnsm);
if (n != null)
String filename = n.InnerText;
Le débogueur Visual Studio affiche le nom de fichier = □.txt
cela ne peut être qu'un bogue visuel de Studio. Malheureusement File.Exists(filename)
retourne false, alors que le fichier existe réellement.
Qu'est-ce qui ne va pas?
3 réponses
N'utilisez pas seulement le débogueur ou la console pour afficher la chaîne comme une chaîne.
à la place, videz le contenu de la chaîne, un caractère à la fois. Par exemple:
foreach (char c in filename)
{
Console.WriteLine("{0}: {1:x4}", c, (int) c);
}
qui vous montrera le contenu réel de la chaîne, en termes de points de code Unicode, au lieu d'être limité par ce que la police courante peut afficher.
utiliser le Tableaux de codes Unicode pour rechercher les caractères spécifiés.
si je me souviens bien, la méthode XmlDocument.Load(string)
suppose toujours UTF-8, quel que soit L'encodage XML.
, Vous devez créer un StreamReader
avec le bon encodage et de l'utiliser comme paramètre.
xmlDoc.Load(new StreamReader(
File.Open("file.xml"),
Encoding.GetEncoding("iso-8859-15")));
EDIT:
je viens de tomber sur KB308061 de Microsoft. Il y a un passage intéressant:
Spécifiez la déclaration de codage dans la section déclaration XML du XML document. Par exemple, les suivantes déclaration indique que la le document est dans le codage Unicode UTF-16 format:
<?xml version="1.0" encoding="UTF-16"?>
notez que cette déclaration seulement spécifie le format de codage d'un Document XML et ne modifie pas ou contrôler le format d'encodage réel de les données .
-
votre xml définit-il correctement son encodage ? encoding= "iso-8859-15" .. est-ce que Iso-latin-15
-
Idéalement, vous devriez placer votre contenu dans un élément CDATA .. donc le xml ressemblerait à
<f><![CDATA[€.txt]]></f>
-
Idéalement, vous devriez également échapper à tous les caractères spéciaux avec des valeurs équivalentes codées par url (ou codées par http), parce que xml est typiquement pour communiquer par http.
Je ne sais pas le code exact d'évasion pour € .. mais ce serait quelque chose de ce genre
<f><![CDATA[%3E.txt]]></f>
ce qui précède doit faire € être communiqué correctement par le xml.