2016-03-15 2 views
1

J'ai un problème avec le codage des espaces lorsque j'utilise ToString() sur un Uri en C#, il semble se comporter différemment en fonction de la chaîne d'entrée.
Voici mon bout de code:Pourquoi Uri.ToString() crypte-t-il des espaces différemment selon la chaîne d'entrée?

StringBuilder sb1 = new StringBuilder("root"); 
sb1.Append("/"); 
sb1.Append(System.Uri.EscapeDataString("something with spaces")); 
Uri result1 = new System.Uri(sb1.ToString(), UriKind.Relative); 
// result1.ToString() returns "root/something%20with%20spaces" 

StringBuilder sb2 = new StringBuilder("root"); 
sb2.Append("/"); 
sb2.Append(System.Uri.EscapeDataString("something with spacés and accènts")); // "root/something%20with%20spac%C3%A9s%20and%20acc%C3%A8nts" 
Uri result2 = new System.Uri(sb2.ToString(), UriKind.Relative); 
// result2.ToString() returns "root/something with spacés and accènts" 

Je ne comprends pas. Est-ce parce qu'il essaie de trouver l'encodage sur chaque chaîne d'entrée et en trouve un autre en raison des accents?

EDIT

Le code ci-dessus est juste un exemple que j'ai essayé de courir dans la fenêtre immédiate, l'extrait réel de code est dans un getter d'un paramètre Uri ressemble plus à ceci:

public Uri RelativeUri 
{ 
    get 
    { 
     List<string> partsOfUri = new List<string>(); 
     this.getParts(this, parts); 
     StringBuilder sb = new StringBuilder(this.Root); 
     parts.Reverse(); 
     parts.ForEach(p => 
     { 
      sb.Append("/"); 
      sb.Append(System.Uri.EscapeDataString(p)); // to avoid problems with '/' in parts 
     }); 
     return new System.Uri(sb.ToString(), UriKind.Relative); 
    } 
} 

Les parties sont des étiquettes qui peuvent avoir des barres obliques, des accents, des espaces, etc. Quelque part ailleurs dans ma solution, j'appelle le MyObject.RelativeUri.ToString() et j'ai ce comportement étrange.

Encoding.Default retours System.Text.SBCSCodePageEncoding

Répondre

0

j'ai essayé l'exécution de votre code.

Il donne correctement le résultat suivant:

root/something%20with%20spac%C3%A9s%20and%20acc%C3%A8nts 

Pouvez-vous partager comment et où vous essayez d'exécuter ce code?

Pour votre référence, Encoding.Default me donne le résultat suivant:

System.Text.SBCSCodePageEncoding 
+0

-je obtenir le même résultat que l'OP. 'sb2.ToString()' produit la sortie attendue, mais l'appel suivant à 'result2.ToString()' ne le fait pas - c'est là que le codage des espaces et des caractères spéciaux est annulé. – hlintrup

+0

Je reçois aussi 'System.Text.SBCSCodePageEncoding' quand j'appelle' Encoding.Default' – hlintrup

+0

OP a à la fois un accent grave et un accent aigu dans 'sb2'. Avoir seulement un accent grave produit la sortie attendue. Peut-être que seulement un sous-ensemble de caractères peut être correctement traité – hlintrup