Почему .NET не может декодировать эту строку, когда Java может «Привет% E1»? - PullRequest
2 голосов
/ 19 февраля 2010

Моя проблема связана с тем, что библиотеки .Net Http / Uri не могут декодировать или удалять эту последовательность символов: «Привет% E1». Ни Uri.UnescapeDataString , ни HttpUtility.UrlDecode не могут этого сделать.

Хотя у меня есть решение, чтобы обойти эту проблему ( путаница с декодированием URL ), я хотел бы понять, почему она не работает.

1-й тест здесь вызывает исключение! Второй просто не получается.

Assert.That(Uri.UnescapeDataString("Hi%E1"), Is.EqualTo("Hiá"));
HttpUtility.UrlDecode("Hi%E1").ShouldBe("Hiá");

В документах нет ничего, что указывало бы на то, что UnescapeDataString или UrlDecode ограничены наборами символов или любой причиной, по которой эти тесты не пройдут. Однако из тестирования может показаться, что HttpUtility предполагает кодировку UTF-8 (или некоторую другую).

Эквивалент Java работает! Возможно, потому что это позволяет установить кодировку.

URLDecoder.decode("Hi%E1","windows-1252");    // this works btw, ie passes tests

Это выглядит как очень разумный шаг, учитывая обходной путь .Net (см. URL выше)

.Net .Net реализации этих методов просто дерьмо и разработчики .Net просто должны написать свои собственные - или я что-то упустил?

Кстати, все, что я знаю в IIS, установлено на UTF-8 , и китайские / японские символы отображаются нормально, поэтому я пока не знаю, как могло случиться, что этот URI состоит из windows-1252 закодированные символы. Если бы я мог исправить URI так, чтобы он содержал кодировку UTF-8, это был бы лучший способ исправить это.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2010

Добавление

Я обнаружил причину этой проблемы. Я использовал 'escape' в javascript - он устарел, не используйте его.

escape ('á') возвращает '% E1' - кодировку windows-1252 (т. Е. Он не будет работать или вернет неправильный символ при использовании описанных выше методов, например HttpUtility.UrlDecode , если вы не можете указать «windows-1252» в перегрузке)

encodeURI ('á') возвращает '% C3% A1' - это кодировка UTF-8 . Который будет работать, и все ваши проблемы уйдут. Методы, описанные выше, будут работать без выдачи исключений или создания неправильного символа.

Dreaming: Разве не было бы хорошо, если бы Uri.UnescapeDataString указывал, какой escape-символ был проблемой? Мой URI на момент постановки диагноза составлял 23 000 символов. «Неверный URI» не является таким полезным сообщением в этом сценарии.

2 голосов
/ 19 февраля 2010

В соответствии с этим вы также можете установить кодировку с помощью HttpUtility.UrlDecode.

Хотя это кажется простым, если вы столкнулись с проблемами ... просто убедитесь, что выувидел перегрузку.

1 голос
/ 19 февраля 2010

Кажется, работает как указано ...

HttpUtility.UrlDecode("Hi%E1", System.Text.Encoding.GetEncoding("windows-1252"));

Редактировать: Ответ на комментарий.

Если вы используете Reflector для HttpUtility.UrlDecode (string), вы видите, что он использует UTF8кодировка по умолчанию.(Как и должно быть.)

//From Reflector (System.Web)
public static string UrlDecode(string str)
{
    if (str == null)
    {
        return null;
    }
    return UrlDecode(str, Encoding.UTF8);
}
...