Получение U + fffd / 65533 вместо специального символа из строки запроса - PullRequest
1 голос
/ 30 апреля 2009

У меня есть веб-проект на C # .net, для которого установлен тег глобализации:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>

Когда этот URL-адрес представляет собой приложение Flash (возникает та же проблема при вводе URL-адреса вручную в браузере): c_product_search.aspx? Search = kjøkken (или c_product_search-aspx? Search = kj% F8kken

Оба возвращают следующие коды символов:

k U+006b 107
j U+006a 106
� U+fffd 65533
k U+006b 107
k U+006b 107
e U+0065 101
n U+006e 110

Я не знаю слишком много о кодировке символов, но кажется, что ø был дан символ замены юникода, верно?

Я попытался изменить тег глобализации на:

<globalization requestEncoding="iso-8859-1" responseEncoding="utf-8" culture="nb-no" uiCulture="no"/>

Это заставило запрос работать. Однако теперь другие поиски на моей странице перестали работать.

Я также попробовал следующее с похожими результатами:

NameValueCollection qs = HttpUtility.ParseQueryString(Request.QueryString.ToString(), Encoding.GetEncoding("iso-8859-1"));
string search = (string)qs["search"];

Что мне делать?

С уважением,

nitech

Ответы [ 5 ]

3 голосов
/ 02 октября 2009

Проблема исходит от комбинации Firefox / Asp.Net. Когда вы вручную вводите URL-адрес в адресную строку Firefox, если URL-адрес содержит французские или шведские символы, Firefox по умолчанию кодирует URL-адрес с помощью ISO-8859-1.

Но когда asp.net получает такой URL, он думает, что он закодирован в utf-8 ... И закодированные символы становятся "U + fffd". Я не смог найти способ asp.net, чтобы определить, что URL-адрес "ISO-8859-1". Request.Encoding установлен в utf-8 ...: (

Существует несколько решений:

  • поместите <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"/> в ваш Web.config. Но вы можете столкнуться с другими проблемами, и ваше приложение больше не будет стандартным (оно не будет работать с такими языками, как японский) ... И вообще, я предпочитаю использовать UTF-8!

  • зайдите в about: config в Firefox и установите значение network.standard-url.encode-query-utf8 в true. Теперь он будет работать для вас (Firefox закодирует все ваши URL с помощью utf-8). Но не для кого-то еще ...

  • Наименее худшее решение, которое я мог найти, - это обработать его с помощью кода. Если декодирование по умолчанию не сработало, мы переопределяем QueryString с iso8859-1:

    string query = Request.QueryString["search"];
    if (query.Contains("%ufffd"))
        query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))["search"];
    query = HttpUtility.UrlDecode(query);
    

Работает с гиперссылками и введенным вручную URL на французском, английском или японском языках. Но я не знаю, как он будет обрабатывать другие кодировки, такие как ISO8859-5 (русский) ...

У кого-нибудь есть лучшее решение?

Это решает только проблему введенного вручную URL. В ваших гиперссылках не забывайте кодировать параметры URL-адреса с помощью HttpUtility.UrlEncode на сервере или кодировать URIComponent в коде JavaScript. И используйте HttpUtility.UrlDecode для его декодирования.

1 голос
/ 01 июля 2011
    public string GetEncodedQueryString(string key)
    {
        string query = Request.QueryString[key];
        if (query != null)
            if (query.Contains((char)0xfffd))
                query = HttpUtility.ParseQueryString(Request.Url.Query, Encoding.GetEncoding("iso-8859-1"))[key];
        return query;
    }
0 голосов
/ 04 мая 2009

Если приложение ожидает, что запрос в кодировке URL основан на UTF-8, символ "ø" должен быть "%C3%B8", а не "%F8". Независимо от того, какую функцию вы используете для экранирования / кодирования этого запроса, вам, вероятно, нужно передать ему имя базовой кодировки символов, "UTF-8".

0 голосов
/ 19 мая 2009

Оказывается, что ActionScript 2.0 будет отправлять URL-адрес, закодированный или экранированный с помощью UTF-8, в то время как ActionScript 3.0 использовал ISO-8859-1. Чтобы решить эту проблему, нужно изменить значение Request.Encoding внутри Global.asax, если в URL указана кодировка:

void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext ctx = HttpContext.Current;

    // encoding specified?
    if (!String.IsNullOrEmpty(Request["encoding"]))
    {
        ctx.Request.ContentEncoding = System.Text.Encoding.GetEncoding(ctx.Request["encoding"]);
    }        
}

Может ли это быть сделано по-другому?

С уважением, nitech

0 голосов
/ 30 апреля 2009

Я думаю, что ваша проблема во флеше, а не в .net. он посылает специальный символ странным образом. попытайтесь выполнить кодирование строки поиска перед отправкой на сервер.

...