将HTML格式的字符串转换为mailto链接

4
在Java web应用中,我需要一个自动转换器将字符串转换为可用于mailto链接的格式。
例如,我有这个字符串"S&D",在HTML中可以正确地显示为"S&D"。但现在我需要在我的网页上使用mailto链接。
<a href="mailto:?subject=my%20subject&body=S&amp;D">share</a>

字符串中出现了错误的字符"&",因此我需要将"&"转换成"%26"。

有没有相关的库可以做到这一点呢?

我尝试过java.net.URLEncoder,但它只能将"&"替换为"%26",而且还把空格" "替换成加号"+"。 我还尝试过java.net.URI,但对于字符"&"它什么也没做!

1个回答

11

引用 RFC 6068(感谢JB Nizet):

在生成'mailto' URI时,所有空格应编码为%20,'+'字符可以被编码为%2B。请注意,'+'字符经常用作电子邮件地址的一部分,以指示子地址,例如:<bill+ietf@example.org>

更新后的代码:

String subject = URLEncoder.encode("my subject", "utf-8").replace("+", "%20");
String body = URLEncoder.encode("S&D", "utf-8").replace("+", "%20");
// Email addresses may contain + chars
String email = "test@example.com".replace("+", "%2B");
String link = String.format("mailto:%s?subject=%s&body=%s", email, subject, body);
System.out.println(StringEscapeUtils.escapeHtml(link));

输出:

mailto:test@example.com?subject=my%20subject&amp;body=S%26D

以下是可用于链接的示例:

<a href="mailto:test@example.com?subject=my%20subject&amp;body=S%26D">mail me</a>

StringEscapeUtils.escapeHtml(String str) 来自于 Apache Commons Lang


这将转义HTML特殊字符,但不会对mailto“请求字符串”中的每个参数进行编码。每个参数应首先进行编码,然后整个URL应进行HTML转义。 - JB Nizet
2
问题在于URLEncoder使用+代替空格,而这在mailto链接中不起作用(+实际上是邮件主题中的一个字符)。但参数必须以某种方式进行编码,至少对于多行正文而言是如此。请参见http://tools.ietf.org/html/rfc6068#page-8。 - JB Nizet
URLEncoder.encode("S&D", "UTF-8") 是可以工作的,但 URLEncoder.encode("S&D", "UTF-8") 不行!我检索到 HTML 字符并需要转换为邮件链接。 - BasicCoder
源页面中的链接是S%26amp%3BD,而邮件客户端软件中的结果是S&D。 - BasicCoder
对我来说,S&D 能够正确编码为 S%26D。我已经在我的回答中添加了输出和用法。 - Sahil Muthoo

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