将ASCII/UTF16字符进行URL编码

3

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

例如,我试图对包含字符'â'的字符串进行编码。根据w3schools的说法,我期望该字符被编码为'%E2'(我必须调用的PHP系统也期望如此...)。

我尝试使用以下方法:

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

然而,它们都将这个字符编码为:%C3%A2。
我想这与.Net中的字符串是UTF-16编码有关。因此,为了避免这个问题,例如可以这样写:
"%" + ((int)character).ToString("X")

然而,我想知道这个框架是否已经有一个内置的方法(我在这里或其他地方找不到任何答案,为什么我的字符被编码成这种方式)?

2个回答

5
原因并不是.NET使用UTF-16编码的字符串。而是因为UrlEncode(string)重载默认使用UTF-8编码,%C3%A2是正确的â的UTF-8编码:

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

如果你更喜欢其他编码方式(例如Latin-1或Codepage 1252,其中â对应于%E2),你可以使用另一个允许你指定编码的重载。
var x = HttpUtility.UrlEncode("â", Encoding.GetEncoding(1252));

谢谢你们两个。我没有注意到有重载... 我把答案给你,因为你是第一个回答的人。 - Matthieu

3

只需传递正确的编码到 System.Web.HttpUtility.UrlEncode 中(Windows-1252Windows-1254ISO-8859-1ISO-8859-9 等,根据实际情况选择)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接