У меня проблема с кодировкой пробелов, когда я использую ToString() на Uri в C#, она, похоже, ведет себя по-разному в зависимости от входной строки.
Вот мой фрагмент кода:Почему Uri.ToString() кодирует пространства по-разному в зависимости от входной строки?
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"
Я не понимаю. Это потому, что он пытается найти кодировку на каждой входной строке и находит другую из-за акцентов?
EDIT
Код выше просто пример, который я попытался запустить в окне Immediate, реальный фрагмент кода в геттер параметра Uri выглядит примерно так:
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);
}
}
Части - это метки, которые могут иметь косые черты, акценты, пробелы и т. Д. Где-то в моем решении я звоню MyObject.RelativeUri.ToString()
, и я получил это странное поведение.
Encoding.Default
возвращает System.Text.SBCSCodePageEncoding
я получаю тот же результат, как и ОП. 'sb2.ToString()' производит ожидаемый вывод, но следующий вызов 'result2.ToString()' is not - то, где кодирование пробелов и специальных символов отменено. – hlintrup
Я тоже получаю 'System.Text.SBCSCodePageEncoding' при вызове' Encoding.Default' – hlintrup
OP имеет как серьезный акцент, так и острый акцент в 'sb2'. Наличие только серьезного акцента (ов) дает ожидаемый результат. Может быть, только подмножество символов может быть правильно обработано – hlintrup