Я разрабатываю общий обработчик 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, который я отправляю в базу данных. Как будто персонаж не был опознан.
Я что-то не так делаю, когда значение извлекается из строки запроса и преобразуется в строку?