0

我正在 VS2005 中开发一个通用的 HTTP 处理程序并在调试模式下对其进行测试。它运行良好,除非查询字符串包含高位字符,例如拉丁小写字母 Thorn /u00FE þ和拉丁小写字母 Ae /u00E6 æ

我机器上的 IE8 设置为发送 UTF-8 URL。调试代码时,我在 IE8 地址栏中输入以下内容:

    http://app/myHandler.ashx?term=foo // 一切正常
    http://app/myHandler.ashx?term=þorn // 不起作用 -- 从数据库查询失败

数据库是 SQLite,它使用 UTF-8 编码并且工作正常。当使用其他 GUI 工具或使用 Visual Studio 的 System.Data.SQLite GUI 加载项直接针对 SQLite 发出查询时,使用这些特殊字符的查询可以正常工作。

我是否正确解码查询字符串中的值?GetString() 不解码字节吗?

  公共标准请求(HttpContext 上下文)
    {
        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。

但是,当我在本地窗口中检查查询字符串值时,查询字符串“þorn”中的术语值显示为“[]orn”,这就是它在我发送到的 sql 语句中的显示方式数据库。就好像这个角色没有被认出来一样。

我在从查询字符串中获取值并转换为字符串的方式上做错了吗?

4

2 回答 2

0

context.Request.QueryString["term"]在解码之前,整数中包含什么?也许它已经具有您想要的价值。如果当前字节不是 UTF8,utf8.GetBytes将无济于事。

于 2010-01-21T19:26:57.463 回答
0

感谢您的提示,eed3si9n。它使我找到了解决方案。

我的(错误的)印象是 IE 会将手动输入到地址栏中的字符转换为设置中指定的编码。它没有。在那里输入的 URL 必须已经编码。

于 2010-01-24T11:51:51.707 回答