我有一个特定于 Java 6 中的 Java Desktop API 的问题,更具体地说是 desktop.mail(URI uri)..
我想知道是否有一个函数可以用来确保 f.ex 中的主题和正文:
mailToURI = new URI("mailto", getToEmails() + "?SUBJECT="+ getEmailSubject() + "&BODY="+ getEmailBody(), null);
桌面.mail(mailToURI);
将按照 rfc2368 进行保存并在电子邮件应用程序中仍能正确显示?
现在有问题的文本示例是斯堪的纳维亚字母:æøå/ÆØÅ 并在正文中添加复杂的 URL,其中包含和号 (&) 等 f.ex:http://www.whatever.com?a=b&c=d 等。
在使用 mailto: URI 方案和 Java Desktops 邮件 (URI) 函数时,Java 中是否有一个函数可以确保上述寻求的完整性得以保留?
有没有可能做一个?
此时我已经尝试了所有我能想到的方法,包括:
- MimeUtility.encodeText()
- URLEncode.encode(..
- 自定义函数 encodeUnusualCharacters()
private static final Pattern SIMPLE_CHARS = Pattern.compile("[a-zA-Z0-9]");
private String encodeUnusualChars(String aText) {
StringBuilder result = new StringBuilder();
CharacterIterator iter = new StringCharacterIterator(aText);
for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
char[] chars = {c};
String character = new String(chars);
if (isSimpleCharacter(character)) {
result.append(c);
} else {
//hexEncode(character, "UTF-8", result);
}
}
return result.toString();
}
private boolean isSimpleCharacter(String aCharacter) {
Matcher matcher = SIMPLE_CHARS.matcher(aCharacter);
return matcher.matches();
}
/**
For the given character and encoding, appends one or more hex-encoded characters.
For double-byte characters, two hex-encoded items will be appended.
*/
private static void hexEncode(String aCharacter, String aEncoding, StringBuilder aOut) {
try {
String HEX_DIGITS = "0123456789ABCDEF";
byte[] bytes = aCharacter.getBytes(aEncoding);
for (int idx = 0; idx < bytes.length; idx++) {
aOut.append('%');
aOut.append(HEX_DIGITS.charAt((bytes[idx] & 0xf0) >> 4));
aOut.append(HEX_DIGITS.charAt(bytes[idx] & 0xf));
}
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(LocalMail.class.getName()).log(Level.SEVERE, null, ex);
}
}
- 还有更多...
我最多只能在打开的电子邮件中看到经过编码的文本。
不提供任何特殊编码将导致 æøå 或类似停止对内容的进一步处理。
我觉得我错过了一些重要的东西。谁能给我一个解决方案?
对于换行符,我使用 String NL = System.getProperty("line.separator");
也许需要调用一些系统特定的东西才能使它正常工作??
顺便说一下,我目前使用的是 Mac OS X 10.6.8 和 Mail 4.5
marius$ java -version Java 版本“1.6.0_26” Java(TM) SE 运行时环境(build 1.6.0_26-b03-384-10M3425) Java HotSpot(TM) 客户端 VM(构建 20.1-b02-384,混合模式)
我真的觉得必须有办法——否则 desktop.mail(URI) 函数的主题和消息部分完全不可靠,以至于无法使用。
非常感谢任何帮助我指明正确方向的人!!
最佳答案
谢谢 Marius,这是一行非常有用的代码。
为了性能我稍微修改了一下...
当您不使用 RegExp 时,最好使用“replace”而不是“replaceAll”。
这个:
.replace("+", "%20")
快于:
.replaceAll("\\+", "%20")
两者都替换ALL occurrences,但第一个不必进行任何正则表达式解析。 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28java.lang.CharSequence,%20java.lang.CharSequence%29
另外,如果原始字符串已经有\r\n 换行,第二个替换将使\r 加倍。这不是什么大问题,但我更愿意删除那个并提供正确的输入字符串:
String result = java.net.URLEncoder.encode(src, "utf-8").replace("+", "%20")
关于java - Desktop.Action.MAIL 为 mailto : in URI 正确编码主题和正文字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762155/