2016-03-15 11 views
1

У меня проблема с кодировкой пробелов, когда я использую 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

ответ

0

Я попытался запустить свой код.

Это правильно дает следующий результат:

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

Можете ли вы поделиться, что, как и где вы пытаетесь запустить этот код?

Просто для справки, Encoding.Default дает мне следующий результат:

System.Text.SBCSCodePageEncoding 
+0

я получаю тот же результат, как и ОП. 'sb2.ToString()' производит ожидаемый вывод, но следующий вызов 'result2.ToString()' is not - то, где кодирование пробелов и специальных символов отменено. – hlintrup

+0

Я тоже получаю 'System.Text.SBCSCodePageEncoding' при вызове' Encoding.Default' – hlintrup

+0

OP имеет как серьезный акцент, так и острый акцент в 'sb2'. Наличие только серьезного акцента (ов) дает ожидаемый результат. Может быть, только подмножество символов может быть правильно обработано – hlintrup