2008-12-11 7 views
0

J'ai deux ordinateurs. Les deux exécutant WinXP SP2 (je ne sais pas vraiment comment ils sont au-delà). Je cours MS Visual C# 2008 Express Edition sur les deux et c'est ce que j'utilise actuellement pour programmer.Je pense que c'est une sorte de problème d'encodage

J'ai fait une application qui charge dans un fichier XML et affiche le contenu dans un DataGridView.

La première ligne de mon fichier xml est:

<?xml version="1.0" encoding="utf-8"?> 

... et vraiment ... il est utf-8 (au moins selon MS VS C# quand je viens d'ouvrir le fichier là-bas).

Je compile le code et l'exécute sur un ordinateur, et le contenu de mon DataGridView semble normal. Pas de personnages drôles. Je compile le code et l'exécute sur l'autre ordinateur (ou prends simplement la version publiée de l'ordinateur n ° 1 et l'installe sur l'ordinateur n ° 2 - j'ai essayé dans les deux sens) et dans datagridview, où il y a des sauts de ligne le fichier xml, je vois des personnages carrés drôles. Je suis un novice en matière d'encodage ... donc la seule chose que j'ai vraiment essayé de résoudre était d'utiliser ce même programme pour écrire le contenu de mon xml dans un nouveau fichier xml (mais je l'écris en fait à un fichier texte, avec les balises xml, car l'écriture par défaut dans un fichier texte semble être utf-8. Ensuite, j'ai lu ce nouveau fichier dans mon programme. J'ai les mêmes résultats.

Je ne sais pas quoi faire d'autre ou comment résoudre ce problème ou ce que je pourrais fondamentalement mal faire en premier lieu.

-Adeena

+0

Je vérifierais pour voir à quel point les 2 ordinateurs sont similaires car je pense que le problème a à voir avec la lecture de caractères "spéciaux" qui sont dans le fichier qui sont interprétés différemment. Les deux ordinateurs ont-ils la même version du framework .Net installée? Les deux ordinateurs ont-ils la même langue? –

Répondre

1

Je ne suis pas sûr de la cause de votre problème, mais une solution serait à juste dépouiller les retours chariot de vos cordes. Pour chaque chaîne que vous ajoutez, il suffit d'appeler TrimEnd(null) sur pour supprimer les espaces de fin:

newrow["topic"] = att1.ToString().TrimEnd(null); 

Si vos cordes pourraient finir dans d'autres espaces (c.-à-espaces ou des tabulations) et que vous voulez garder ceux-ci, puis juste passer un tableau contenant seul le caractère de retour de chariot à TrimEnd:

newrow["topic" = att1.ToString().TrimEnd(new Char[]{'\r'}); 

Disclaimer: Je ne suis pas un programmeur C#; la deuxième instruction peut être syntaxiquement incorrecte

+0

Je pense que vous êtes sur quelque chose avec les garnitures ... cela fonctionne ... Merci !!! – adeena

+0

Cela fonctionne ... et j'utilise aussi string.ToString(). Replace ("\ r", ""). Le seul problème est que je peux dblclick élément dans DataGridView et l'éditer, et si j'entre un retour chariot, il revient quand je retourne à DataGridView. adeena

4

Cela n'a rien à voir avec UTF-8 ou encodages - ce problème a à voir avec line endings. Dans Windows, chaque ligne d'un fichier texte se termine par les deux caractères carriage-return (CR) et newline (LF, pour le saut de ligne), qui sont respectivement les points de code U + 000D et U + 000A. En ASCII et UTF-8, ils sont codés comme les deux octets 0D 0A. D'autre part, la plupart des systèmes non-Windows, y compris Linux et Mac OS X, utilisent uniquement un caractère de nouvelle ligne pour signaler la fin de ligne, il n'est donc pas rare de voir des problèmes de fin de ligne entre Windows et non-Windows. systèmes.

Cependant, puisque vous n'utilisez que Windows sur les deux systèmes, c'est plus un mystère. Une application interprète correctement la combinaison CRLF comme une nouvelle ligne, mais l'autre application est confus par le CR. Les retours chariot ne sont pas des caractères imprimables, donc il remplace le CR par un espace réservé, ce que vous voyez; il interprète alors correctement le saut de ligne comme la fin de la ligne.

+0

Je comprends exactement ce que vous dites ... je ne sais pas exactement comment comprendre ce qui est différent entre mes deux ordinateurs et ce que je devrais faire pour m'assurer que chaque ordinateur l'interprète correctement. – adeena

+0

Si le transfert du fichier cause le problème, vous devriez pouvoir voir les changements (par exemple, changements dans la taille du fichier, différentes sommes de contrôle MD5, différence lors de la visualisation avec un afficheur/éditeur hexadécimal). – mweerden

2

Le carré apparaît généralement lorsque vous utilisez différents types de saut de ligne.

  • Linux - (0A) LF
  • Win - (0D0A) CRLF
  • Mac - (0D) CR

L'application a probablement été créée en utilisant 1 type et l'application en cours d'exécution attend une autre.


Découvrez Environment.NewLine

Et, vous pouvez essayer ceci: (aucune garantie - Je ne vous écris pas beaucoup C#)

strInput = Regex.Replace(strInput, "\\r?\\n?", Environment.NewLine) 
+0

Mais ils sont tous deux des machines Win ... ??? – adeena

+0

Désolé. Ce ne sont que "plus commun" - ils ne sont pas nécessaires. Ainsi, ils peuvent toujours être mélangés/commutés lors de la sauvegarde. –

+0

Je suis d'accord. le xml a été créé avec une sécure d'échappement diffente. \ r \ n est la valeur par défaut de Windows. Linux par exemple utilise seulement les utilisations \ n ... –

0

@ Adam: Désolé! Vous avez manqué votre déclaration précédente.

Pour charger le document dans le programme et l'affichage dans le DataGridView, je suis en train de faire (je dis « actuellement », parce que j'ai essayé d'autres choses comme l'utilisation XDocument au lieu de XElement):

XElement xe1 = XElement.Load(filePath); 

DataTable myTable = new DataTable(); 
myTable = mkTable(); // calls a function that makes the table 
var _categories = (from p1 in xe1.Descendants("category") select p1); 
int numCat = _categories.Count(); 
int i = 0; 

while (i < numCat) 
{ 
    DataRow newrow; 
    newrow = myTable.NewRow(); 

    if (_categories.ElementAt(i).Parent.Name == "topic") 
    { 
     string att1 = _categories.ElementAt(i).Parent.Attribute("name").Value.ToString(); 
     newrow["topic"] = att1.ToString(); 
    } 
    // repeat the above for the different things in my document 
    myTable.Rows.Add(newrow); 

    i++; 
} 
myDataSet.Merge(myTable); 
bindingSourceIn.DataSource = myDataSet; 
myDataGridView.DataSource = bindingSourceIn; 
myDataGridView.DataMember = "xmlthing"; 

(évidemment les choses sont un peu ici ... soit abrégée, mon BindingSource/etc datagridview est déclaré ailleurs .... mais nous espérons que cela est suffisant pour donner un sens)

-Adeena

Questions connexes