2017-10-18 27 views
0

J'ai des fichiers xml qui représentent des courriels exportés à partir d'un client de messagerie. Malheureusement, lorsque j'essaie de lire ces fichiers, les caractères spéciaux ne sont pas affichés car les caractères d'origine étaient affichés.mauvais codage - le remplacement numérique xml est mal interprété

J'essaye de faire lire ceci correctement dans un client que j'écris. Net.

Exemple: Je reçois le remplacement numérique suivant:

á 

Cela est interprété comme:

á 

Bien que la valeur d'origine/attendu est:

ú 

A peut-être meilleur exemple:

Tað eftir er av árinum ber tó til at logga á 

interprété comme cela devient:

Tað eftir er av árinum ber tó til at logga á 

La valeur d'origine/attendu est:

Tað eftir er av árinum ber tó til at logga á 

Je peux constater que le problème semble être que .Net interprète à ° comme deux caractères séparés, alors qu'en réalité ils représentent un personnage.

je crois que je devrais être en mesure d'utiliser ce site pour traduire la valeur interprétée dans la valeur attendue (mais pas exactement les mêmes caractères je reçois): http://www.i18nqa.com/debug/utf8-debug.html

Mais je suis incapable de l'obtenir affiché correctement. Net.

x.Load(
    New StreamReader(
    File.Open("content.xml", FileMode.Open), 
    Encoding.GetEncoding(1252), True 
) 
) 

Ceci ne fait pas de différence. Si je tente Encoding.Unicode alors il ne parvient pas à lire le fichier (erreur: données au niveau racine est invalide)

+0

Pourquoi vous attendez-vous à ce que deux remplacements numériques soient analysés comme un seul caractère? Les remplacements numériques sont pour * caractère * entités, pas * octets *. TL; DR: Je crois que votre XML est incorrect, pas la manipulation de .NET. –

+0

Peut-être que je pourrais prendre manuellement les deux valeurs décimales 195 et 161 et convertir en hexadécimal, cela deviendrait c3 et ba qui est la valeur hexadécimale UTF-8 pour le caractère ú. Mais cette fonctionnalité de conversion n'est-elle pas intégrée dans .net? – Andras

+0

Je pense que vous avez manqué mon point.Le traitement XML dans .NET fait exactement ce qu'il devrait faire. Si vous voulez représenter U + 00FA en XML, il doit être représenté par "ú" ou "ú". Le nombre dans l'entité est un point de code, comme spécifié ici: https://www.w3.org/TR/xml/#sec-references - ce n'est * pas * destiné à être "un octet qui fait partie d'une représentation codée de un caractère". –

Répondre

0

trouvé ma réponse dans un autre post: https://stackoverflow.com/a/5130065/1113421

Nous avons fini premier chargement du document en UTF-8 , puis sur les nœuds XML que je avais besoin, je les convertis sur la volée:

code VB

Dim x As New XmlDocument 

x.Load(New StreamReader(File.Open("content.xml", FileMode.Open), Encoding.UTF8, True)) 

Dim nl As XmlNodeList = x.SelectNodes("product/HEADER/object") 

    For Each nd As XmlNode In nl 
    Dim result As String = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(nd.InnerText)) 
    Me.txtTemporaryTextbox.Text += result & vbCrLf 
    Next 

Cela m'a donné l'interprétation correcte des caractères étrangers dans le nd.InnerText.

Merci @JonSkeet pour l'élaboration et les liens qui m'ont pointé dans la bonne direction, pour creuser plus loin.

+0

Lors du chargement de XML à partir d'un flux d'octets (tel qu'un fichier), il n'est pas nécessaire de spécifier le codage de caractères. Laissez simplement le moteur XML découvrir l'encodage. Lors du chargement du fichier, n'utilisez pas de lecteur de caractères, utilisez un flux d'octets. –