给定:
String email1 = "simple@example.org";
// legal email address according to wikipedia [1]
String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org";
创建mailto: URI (以字符串对象的形式)的最佳/正确方法是什么?
我试过了:
String uri = new URI("mailto", the_email_address, null).toString();
这是我得到的最接近的结果,但它没有编码问号(?)在电子邮件地址的本地部分,但根据RFC 6068,它应该是。它在RFC中的示例中也会失败,比如"not@me"@example.org或unlikely?address@example.com。
PS:在Should plus be encoded in mailto: hyperlinks?中有一些有用的信息
我接受这个作为一种解决方案:
import org.apache.http.client.utils.URIBuilder;
// from Apache HttpClient
// maven group: org.apache.httpcomponents artifact: httpclient
String emailURL = new URIBuilder().setScheme("mailto").setPath(the_email_address).toString();
发布于 2015-05-15 20:59:41
您必须手动对?
和&
进行百分比编码/转义。
String email2 = "\"()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org";
String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26");
因此,似乎?
和&
符号在URI中没有被正确转义。URI中?
之后的任何内容都将被忽略,因为该符号是为URI中的“查询字符串”保留的。参考here。
根据this和参考文档,我们也需要避开&
。由于某些原因,Java并没有为我们做到这一点。事实上,RFC 6068甚至声明:
可以出现在中的字符数必须采用百分比编码。根据STD66,这些字符不能出现在URI中,还有"%“(因为它用于百分号编码)和gen-delims中除"@”和":“之外的所有字符(即"/”、"?“、"#”、"“和"")。在分隔符中的字符中,至少以下字符也必须是百分号编码的:"&“、";”和"=“。
修复它的方法(有点黑客,但它是有效的)是手动转义这些字符使用%
后跟2位ASCII十六进制值的符号。参考this。
我通过将结果字符串粘贴到Chrome中进行了测试,它正确地打开了我的默认电子邮件,其中包含一封电子邮件
"()<>[]:,; @\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
更多研究
所以看起来Java类使用了RFC 2396,它声明:
如果URI组件的数据与保留的目的冲突,则必须在形成URI之前对冲突的数据进行转义。
保留= ";“| "/”| "?“| ":”| "@“| "&”| "=“| "+”| "$“| ",”
上面的“保留的”语法类指的是URI中允许的那些字符,但是在通用URI语法的特定组件中可能不允许的那些字符;
发布于 2015-05-18 18:40:42
ASCII值应该是未转义的,并且可以包含非
字符。
Java URI doc说,你不能直接使用java uri类。
所有标点符号与字符串"?/[]@" are Reserved 中的标点符号一起保留。
Java的URI类使用RFC 2396,它规定:如果URI组件的数据与保留的目的冲突,则必须在形成URI之前对冲突的数据进行转义。
保留= ";“| "/”| "?“| ":”| "@“| "&”| "=“| "+”| "$“| ",”
您可以使用java.net.URLEncoder
对user_name进行编码,然后使用编码的用户名创建URI String uri = new URI("mailto", the_email_address, null).toString();
,或者
您可以手动进行百分号编码/转义?和&。
;@\\"!#$%&'*+-/=?^_{}| ~.a\"@example.org"; String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26"); In JavaScript you can use the
encodeURI()function. PHP has the
rawurlencode()function, and ASP has the
Server.URLEncode()` email2 = "\"()<>[]:,String函数.
发布于 2015-05-21 07:43:00
您可能希望使用URI.create(String uri)静态方法来创建mailto uri,而不是使用"new“构造函数。例如,这将返回一个有效的URI (我使用的是jdk 7):
URI.create("mailto:john?doe@foo.bar.com");
我希望它能帮上忙。
干杯。
https://stackoverflow.com/questions/30133266
复制相似问题