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
-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
Je reçois aussi 'System.Text.SBCSCodePageEncoding' quand j'appelle' Encoding.Default' – hlintrup
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