我需要在URL上进行301重定向,其中可能包含Unicode字符。
HttpUtility.UrlEncode没有做我需要的东西,因为如果我对整个网址进行编码,它会编码任何':'或'/'
HttpUtility.UrlEncode("http://www.हिन्दी.com") = http%3a%2f%2fwww.%e0%a4%b9%e0%a4%bf%e0%a4%a8%e0%a5%8d%e0%a4%a6%e0%a5%80.com
(另外:http://www.%e0%a4%b9%e0%a4%bf%e0%a4%a8%e0%a5%8d%e0%a4%a6%e0%a5%80.com似乎不适用于Firefox或IE,但它确实在Chrome中运行)
我能想到的另一件事就是对URL的不同部分进行编码,以便协议不会被编码。
答案 0 :(得分:3)
您需要查看RFC 3490,其中详细说明了如何正确编码国际域名 - 这也是为什么当您只对域部分进行编码时,它只适用于Chrome)
答案 1 :(得分:1)
所以我想出了几乎100%的解决方案。感谢Rowland Shaw和Rup将我指向IDN的方向。
我尝试使用IdnMapper,其函数GetAscii将unicode域名转换为punycode,但我没有将域与URL的其余部分分开。我尝试将url放入Uri对象,但如果url有unicode字符,我会得到一个UriFormatException。
这导致我:http://msdn.microsoft.com/en-us/library/system.uri(v=VS.90).aspx
说明如何启用Uri类接受unicode并执行IDN和IRI转换。它说你必须在.NET 2.0 machine.config文件中添加一些东西,但是你可以将这行放在web.config中,它会起作用。
在我使用unicode工作后,我拼凑了网址并进行了重定向:
Response.Clear();
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", uri.Scheme + "://" + uri.DnsSafeHost + uri.PathAndQuery + uri.Fragment);
Response.End();
这适用于Chrome和Firefox 3.6,但在IE8中失败。我仍在努力解决这个问题,如果找到解决方案,我会在这里更新。