2014-02-18 116 views
2

我试图对一些字符串进行URL编码,但是我使用.Net框架提供的方法存在问题。URL编码ASCII/UTF16字符

例如,我正在尝试包含'â'字符的编码字符串。例如,根据w3schools,我希望这个caracter被编码为'%E2'(我必须调用一个PHP系统也期望这个...)。

我尝试使用以下方法:

System.Web.HttpUtility.UrlEncode("â"); 
System.Web.HttpUtility.UrlPathEncode("â"); 
Uri.EscapeUriString("â"); 
Uri.EscapeDataString("â"); 

然而,它们都编码这个字符为: %C3%A2

我想这事做的事实,在.net中的字符串是UTF-16编码的。因此,为了避免这个问题,我可以这样写,例如:

"%" + ((int)character).ToString("X") 

不过,我想知道,如果框架已经有一个内置的方法(我不能在这里或其他地方找到任何答案为什么我的角色是这样编码的)?

回答

4

的原因是,.NET使用UTF-16编码的字符串。其原因是,该UrlEncode(string) overload默认使用UTF-8,和%C3%A2â正确UTF-8编码:

的HttpUtility.UrlEncode方法默认使用UTF-8编码。因此,使用UrlEncode方法提供了与使用UrlEncode方法和指定UTF8作为第二个参数相同的结果。

如果你喜欢不同的编码(例如Latin-1或代码页1252,其中â对应于%E2),则可以使用另一种过载,允许你指定编码:

var x = HttpUtility.UrlEncode("â", Encoding.GetEncoding(1252)); 
+0

由于两者的您。我没有注意到有超载......我给你答案,因为你是第一个回答。 – Matthieu

3

只是通过正确的编码,以System.Web.HttpUtility.UrlEncodeWindows-1252Windows-1254ISO-8859-1ISO-8859-9等取其合适)

var s = HttpUtility.UrlEncode("â", Encoding.GetEncoding("Windows-1252"));