我正在 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 语句中的显示方式数据库。就好像这个角色没有被认出来一样。
我在从查询字符串中获取值并转换为字符串的方式上做错了吗?