2010-07-05 45 views
0

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

回复此内容在调试代码时似乎没有问题。然而,页面实际上做了重定向到本身(某些其他原因),并重定向位置头看起来是这样的:Location: /myFolder/MyPage.aspx?Param1=%C3%A5

所以%e5已被翻译为%C3%A5这在某种程度上打破了输出。

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

整个Web应用程序都是ISO8859-1编码的。

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

任何指针?

+1

这是不是一个错误,'%C3%A5'只是URL编码的UTF-8版本。错误在于转换为HTML:URL中的每个编码的UTF-8序列必须转换回一个Unicode代码点,然后进行HTML编码。 – Philipp 2010-07-05 16:18:52

+0

实际上,根据http://www.w3schools.com/tags/ref_urlencode.asp,对于'å'来说,当它是'%e5'时,URL编码似乎是正确的。似乎问题在于重定向IIS输出utf-8编码的'location'头,即'%e5'被转换成'%c3%a5' – Polymorphix 2010-07-06 11:30:13

回答

0

我最终解决的解决方案是手动编码重定向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没有为此提供工具,编码修复很快:)