gpt4 book ai didi

java - Desktop.Action.MAIL 为 mailto : in URI 正确编码主题和正文字符串

转载 作者:行者123 更新时间:2023-11-30 11:52:36 26 4
gpt4 key购买 nike

我有一个特定于 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 -versionJava 版本“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com