UrlEncode - Javascript vs. C#

6
我有一个需要一些参数的URL。这些参数的值可能含有重音字符,因此我必须对它们进行UrlEncode。奇怪的是,JavaScript和.NET的行为有所不同。
假设我试图对单词“éléphant”进行UrlEncode。在JavaScript中(根据此网站:http://www.albionresearch.com/misc/urlencode.php),我得到以下结果:%E9l%E9phant。这看起来正确。然而,在.NET中,使用以下调用(System.Web.HttpUtility.UrlEncode("éléphant"))会得到“%c3%a9l%c3%a9phant”。问题出在哪里?我错过了什么?如果我想要在.NET中获得%E9l%E9phant,我该怎么做?
谢谢!

我刚刚也遇到了完全相同的问题。感谢你替我提出这个问题,让我很快找到了问题所在。 - Anne Schuessler
5个回答

10

System.Web.HttpUtility.UrlEncode将使用UTF8(我认为是这样..)作为其默认编码器,您可以通过指定一个编码器来更改它..

System.Web.HttpUtility.UrlEncode("éléphant", Encoding.Default); // %e9l%e9phant

虽然最好是指定实际的代码页或其他内容,而不是依赖于操作系统的默认设置。


7
在JavaScript中(根据此网站:http://www.albionresearch.com/misc/urlencode.php),我得到了以下结果:%E9l%E9phant。

那个页面是错误的。JavaScript也使用UTF-8,与.NET默认使用相同。你可以自己试试:

javascript:alert(encodeURIComponent('éléphant'))
%C3%A9l%C3%A9phant

现在的URL都是UTF-8编码的。不要再尝试使用cp1252编码了,UTF-8才是你的好朋友。相信UTF-8吧!


5

参考:

js:       %E9 l     %E9 phant
.net: %c3 %a9 l %c3 %a9 phant

区别在于一个是 UTF-8 URL 编码,而另一个则是给你 ANSI URL 编码。
在 .NET 中,尝试使用以下代码:
Dim a As String = System.Web.HttpUtility.UrlEncode( _
    "éléphant", _
    Text.Encoding.Default)

我理解了

    %e9 l     %e9 phant

结果匹配您为JavaScript提供的字符串,除了十六进制字符大小写不同。


3

如果您的系统当前的代码页设置为西欧,则 Encoding.Default 只能为您工作。 如果 Javascript 也在与 .NET 编码器在同一台机器上运行,则这可能很重要,但如果不是,则可以强制将代码页设置为西欧:

System.Web.HttpUtility.UrlEncode("éléphant", Encoding.GetEncoding(1252));

2
您也可以尝试对它们进行Base64编码。
有一篇之前的文章介绍了如何在JavaScript中进行编码。
至于在.NET中,有许多示例展示如何进行编码。我在谷歌上找到了一个。
当然,字符串可能会比URL编码大一些。但是,它们将被混淆,这取决于应用程序,可能是一个优势。

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