2010-01-04 5 views
1

Je lit un fichier XML à partir d'un service Web REST, l'analyse et affiche les détails dans un UITableView. Le fichier XML est codé sous iso-8859-1 et contient des caractères accentués. Si j'ajoute juste la chaîne à la vue de table alors j'obtiens un caractère indésirable affiché, ainsi j'ai essayé de le convertir en UTF8 mais il est converti en un point d'interrogation, impliquant qu'il ne comprend pas le caractère.Affichage des caractères iso-8859-1 dans C# avec monotouch

Voici le code:

foreach(XmlNode myNode in myNodeList) 
{ 
    Encoding isoEnc = Encoding.GetEncoding ("iso-8859-1"); 

    string utfResult = Encoding.UTF8.GetString (isoEnc.GetBytes(myNode.InnerText)); 

    _myCollection.Add(utfResult); 
} 

Toutes les idées ce qui se passe ici, et comment afficher les caractères accentués?

Répondre

2

OK, le problème est maintenant résolu. Il semble que mon erreur supposait que le StreamReader traiterait le codage iso-8859-1 par défaut. J'ai changé mon constructeur StreamReader de:

StreamReader reader = new StreamReader (response.GetResponseStream()); 

à:

StreamReader reader = new StreamReader (response.GetResponseStream(), Encoding.GetEncoding("iso-8859-1")); 

En racontant l'StreamReader pour attendre l'encodage correct, tout le reste tombe juste en place.

1

Eh bien, votre "conversion" en UTF-8 est hautement suspecte. Vous dites essentiellement que vous savez mieux que le fichier XML - que bien qu'il prétend être ISO-8859-1, vous vraiment savez qu'il a été codé en UTF-8. Avez-vous une raison de croire cela? Si vous savez ce que les caractères sont censés être, je vous suggère d'ajouter un enregistrement pour indiquer les valeurs Unicode de ces caractères (comme des entiers) et de les comparer avec le code charts on Unicode.org

Ensuite, vous saurez si votre problème est en affichant les caractères, ou en les lisant à partir du flux en premier lieu.

+0

Jon, merci pour cela. Je l'ai fait juste et il semble que ce soit dans la lecture par opposition à l'affichage. Le code XML défini avec encoding = "iso-8859-1", mais si je construis un tableau d'octets de la chaîne prise à partir du nœud en utilisant myNode.InnerText, alors l'octet est 3F qui est un point d'interrogation. Si je construis un tableau unicode, il me renvoie FFFD, qui est un point d'interrogation dans un losange, qui est ce qui est affiché sur UITableView. –

+0

Ne construisez pas un tableau d'octets à partir du XML analysé - regardez le XML lui-même dans un éditeur hexadécimal. Alternative, utilisez InnerText mais ne le convertissez pas en un tableau d'octets: convertissez le premier caractère en entier. Notez que U + FFFD est le caractère "de remplacement", qui est destiné à être utilisé pour les caractères qui ne sont pas supportés par Unicode. Cela semble suspect. –

+0

Comment y arriver. La corde en question est "Ynys Môn", avec le char accentué étant évidemment le problème dans ce cas. En regardant le XML dans un éditeur hexadécimal, je peux voir que le caractère est F4, ce qui est correct. Si je crée une chaîne en utilisant ce qui est indiqué ci-dessus et que je l'affiche dans UITableView, elle s'affiche correctement. Mais couper le char hors de la propriété InnerText de ce nœud, le convertir en un int, il donne 65533 (ou U + FFFD). Voici le code: char tmpChar = Convert.ToChar (myNode.InnerText.Substring (6, 1)); int charVal = Convert.ToInt32 (tmpChar); Console.WriteLine (charVal); –

Questions connexes