在html标签上转义网址

时间:2010-01-28 22:30:50

标签: html jsf

我这样做:

<a href="http%3A%2F%2Flocalhost%3A8080%2Fnews.xhtml%3Fid%3D32%26lang%3Den" target="_blank" />

并在呈现时,链接指向:http://localhost:8080/news.xhtml?id=32&lang=en

我需要此链接指向已编码的网址,而不是解码的网址。

有谁知道怎么逃避它?

更新(根据评论):我需要它来实现在Facebook功能上分享这个。这样做的方法是调用以下链接:http://facebook.com/sharer.php?u=<encoded url to share>

4 个答案:

答案 0 :(得分:5)

你为什么需要这个?然后,该链接将在技术上被打破。

无论如何,您基本上只需要用它们的URL编码表示%替换百分比%25(换句话说:只需将URL 编码两次)。

因此,您特定情况下的结果将是:

http%253A%252F%252Flocalhost%253A8080%252Fnews.xhtml%253Fid%253D32%2526lang%253Den

更新:正如您在JSF上下文中提到的那样,以下是您通常在JSF中创建链接的方式(因此默认情况下已经进行了URL编码):

<h:outputLink value="#{bean.url}" />

如果你想对它进行两次编码,你必须抓住JSTL的c:url

<c:url value="#{bean.url}" var="url" />
<h:outputLink value="#{url}" />

更新2 :根据评论,实际要求现在已经完全清楚了,那么正常的JSF方式就是这样(注意你不一定需要对它进行编码两次在这里!):

<h:outputLink value="http://facesbook.com/sharer.php">
    <f:param name="u" value="#{bean.url}" />
</h:outputLink>

答案 1 :(得分:1)

我不确定你为什么这样做,但你实际上是双重逃避真正的网址:

var s0 = "http://localhost:8080/news.xhtml?id=32&lang=en";
var s1 = escape(s0);
var s2 = escape(s1);
var s3 = unescape(s2);
var s4 = unescape(s3);
// Assume function created for echo
echo("Original: " + s0);
echo("Escape1: " + s1);
echo("Escape2: " + s2);
echo("Unescape1: " + s3);
echo("Unescape2: " + s4);

这导致以下输出:

Original: http://localhost:8080/news.xhtml?id=32&lang=en
Escape1: http%3A//localhost%3A8080/news.xhtml%3Fid%3D32%26lang%3Den
Escape2: http%253A//localhost%253A8080/news.xhtml%253Fid%253D32%2526lang%253Den
Unescape1: http%3A//localhost%3A8080/news.xhtml%3Fid%3D32%26lang%3Den
Unescape2: http://localhost:8080/news.xhtml?id=32&lang=en

注意:通常您只想转义URL的各个参数,而不是整个URL本身。

答案 2 :(得分:0)

有许多资源可以为您执行此操作:

例如,

HtmlEscape.net会将您的文字转义为http://localhost:8080/news.xhtml?id=32&lang=en

这与浏览器所需要的一样多,这里有什么要求?

答案 3 :(得分:0)

我不清楚背景,但我想知道你是否故意编码整个网址?

我的理解是你只需要编码任何不符合URL标准的东西,比如空格,不指明目录的正斜杠等等。

但是假设您可能将URL作为get变量传递给您,也许,您可以使用类似javascript(或jquery)的内容来解码链接指向的位置而不会出现手动双重编码等问题。对于名为URL Encode的jquery来说,它是一个非常简单轻松的附加组件,它可以编码和解码。虽然源代码仍会反映编码,但链接(点击时或悬停时)都会反映未编码的URL