Универсальный обработчик HTTP VS2005 UTF-8: проблемы с определенными символами в строке запроса (например, þ æ) - PullRequest
0 голосов
/ 21 января 2010

Я разрабатываю общий обработчик HTTP в VS2005 и тестирую его в режиме отладки. Это работает хорошо, за исключением случаев, когда строка запроса содержит старшие битовые символы, например, Латинская строчная буква Thorn / u00FE þ и латинская строчная буква Ae / u00E6 æ .

IE8 на моем компьютере настроен на отправку URL-адресов UTF-8. Я набираю следующее в адресной строке IE8 при отладке кода:

    http://app/myHandler.ashx?term=foo  // everything works
    http://app/myHandler.ashx?term=þorn  // does not work -- query from database fails

База данных SQLite, использует кодировку UTF-8 и работает нормально. Запросы, использующие эти специальные символы, работают нормально, если они выполняются непосредственно для SQLite с использованием других инструментов графического интерфейса или с помощью надстроек графического интерфейса System.Data.SQLite для Visual Studio.

Правильно ли я декодирую значения из строки запроса? Разве GetString () не декодирует байты?

  public StandardRequest(HttpContext context)
    {
        UTF8Encoding utf8 = new UTF8Encoding();

        if (context.Request.QueryString["term"] != null)
        {            
            byte[] w = utf8.GetBytes(context.Request.QueryString["term"]);
            word = utf8.GetString(w);
          ...

В обработчике HTTP для ContentEncoding задано значение UTF-8:

     context.Response.ContentEncoding = System.Text.Encoding.UTF8;

и в локальном окне отладчика Request.ContentEncoding также является UTF-8.

Но когда я проверяю значение строки запроса в окне locals, значение term из строки запроса 'þorn' отображается как '[] orn' и именно так оно отображается в операторе sql, который я отправляю в базу данных. Как будто персонаж не был опознан.

Я что-то не так делаю, когда значение извлекается из строки запроса и преобразуется в строку?

Ответы [ 2 ]

0 голосов
/ 24 января 2010

Спасибо за совет, eed3si9n. Это привело меня к решению.

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

0 голосов
/ 21 января 2010

Что содержит context.Request.QueryString["term"] в целых числах перед декодированием? Может быть, это уже имеет значение, которое вы хотите. Если текущих байтов нет в UTF8, utf8.GetBytes не поможет.

...