【问题标题】:Broken encoding after postback回发后编码损坏
【发布时间】:2010-07-05 15:34:54
【问题描述】:

我有一个查询字符串,其参数值包含编码为%e5 的挪威字符å。该页面包含一个带有 action 属性的表单,该属性由 ASP.Net 自动填充。当 URL 输出到所述属性中时,它会以完整的两字节编码打印:%u00e5

在调试后面的代码时,回发这似乎没问题。然而,页面实际上会重定向到自身(出于某种其他原因),并且重定向位置标头如下所示:Location: /myFolder/MyPage.aspx?Param1=%C3%A5

所以%e5 已被翻译成%C3%A5,这会以某种方式破坏输出。

在 HTML 文本中,损坏的字符在通过 HttpUtility.HtmlEncode 输出后看起来像 Ã¥

整个网络应用程序采用 ISO8859-1 编码。

PS。在发布表单之前从 action 属性中的输出%u00e5 中删除 u00 时,一切都很好地输出。但错误似乎是从%e5%C3%A5 的翻译。 (当然还有自我重定向,但这是另一回事。)

任何指针?

【问题讨论】:

  • 这不是错误,%C3%A5 只是 å 的 URL 编码的 UTF-8 版本。错误在于转换为 HTML:URL 中每个编码的 UTF-8 序列必须转换回 Unicode 代码点,然后进行 HTML 编码。
  • 实际上,根据w3schools.com/tags/ref_urlencode.asp%e5 for å 似乎URL编码是正确的。看来问题是重定向IIS输出带有utf-8编码的location标头,即%e5被翻译成%c3%a5

标签: c# asp.net unicode encoding character-encoding


【解决方案1】:

我最终得到的解决方案是手动编码重定向 URL。

public void ReloadPage()
{
    UrlBuilder url = new UrlBuilder(Context, Request.Path);
    foreach (string queryParam in Request.QueryString.AllKeys)
    {
        string queryParamValue = Request.QueryString[queryParam];
        url.AddQueryItem(queryParam, queryParamValue);
    }
    Response.Redirect( url.ToString(), true);
}

url.AddQueryItem 基本上执行 HttpContext.Server.UrlDecode(queryParamValue) 并且 url.ToString 构建查询字符串,并且对于每个查询项执行 HttpContext.Server.UrlEncode(queryParamValue)。

UrlBuilder 是我们库中已经存在的一个类,所以一旦我发现问题并意识到 C#/.Net 没有为此提供工具,编码修复很快:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多