URL Unicode字符编码

6

如何编码包含Unicode的URL?我想将其传递给一个命令行实用程序,并且需要先对其进行编码。

例如:http://zh.wikipedia.org/wiki/白雜訊

变成为http://zh.wikipedia.org/wiki/%E7%99%BD%E9%9B%9C%E8%A8%8A


似乎Stackoverflow文本编辑器编码了Unicode URL。我想在C#中做同样的事情。点击链接获取实际的Unicode URL。 - Tomas
2
Stack Overflow 没有做这件事情 - 是你的浏览器做了!它将 URL 显示为 Unicode,但当你复制它时,复制的文本包含 URL 编码字符串。 - Konrad Rudolph
@KonradRudolph,但是我的浏览器没有。我看到的是我认为是中文字符。 :) - The Dag
@TheDag 这是一个误解:浏览器可能仍然会将URL显示为Unicode,但在内部它是URL编码的。要检查这一点,请尝试从地址栏复制Unicode URL并将其粘贴到文本字段中(但不是地址栏)。 - Konrad Rudolph
4个回答

8
您可以使用System.Web程序集中的HttpUtility.UrlPathEncode方法(需要完整的.NET Framework 4配置文件):
var encoded = HttpUtility.UrlPathEncode("http://zh.wikipedia.org/wiki/白雜訊");

如何获取Unicode字符?URL将由用户传递,我不知道Unicode字符在URL中的位置。 - Tomas
@Tomas:根据您的评论更新了答案。 - Martin Liversage
1
请注意,对于路径和URL的其他部分,UrlPathEncode是正确的操作,但不适用于主机名。如果您在IRI的主机名中有Unicode字符,则必须使用IDN算法(Punycode)对其进行编码以创建URI。 - bobince

4
根据MSDN的说法,您不能再使用UrlPathEncode。现在正确的方法是:
var urlString = Uri.EscapeUriString("http://zh.wikipedia.org/wiki/白雜訊");

0
Server.UrlEncode(s);

.NET 字符串本质上是 Unicode 字符串(具体来说是 UTF-8 编码),因此您只需要调用 HttpServerUtility.UrlEncode 即可(尽管在大多数 ASP.NET 上下文中,所谓的“内置” Server 属性都可用于此操作)。


我不想对://字符进行编码,只对Unicode字符进行编码。 - Tomas
你需要对单独的参数值进行编码,而不是整个URL。 - Matthew
如果我将Unicode URL传递给Server.UrlEncode(s),它将编码所有Unicode字符以及特殊的URL字符,如:冒号,问号和//。我不想这样做。 - Tomas
1
这就是为什么你要对单独的参数进行编码。<a href="mysite.com?myParameter=<%=Server.UrlEncode("SomeUnicodeString")%>">我的链接</a> - Matthew

0
我遇到了土耳其字符的问题。<a href="/@Html.Raw(string)"解决了这个问题。


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