如何对 Internet 地址进行编码
Posted
技术标签:
【中文标题】如何对 Internet 地址进行编码【英文标题】:How to encode Internet address 【发布时间】:2012-06-05 13:02:15 【问题描述】:发送邮件的代码如下:
MimeMessage msg = new MimeMessage(session);
msg.setSubject("subject", "UTF-8"); // here you specify your subject encoding
msg.setContent("yourBody", "text/plain; charset=utf-8");
msg.setFrom("senderAddress");
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(address));
Transport.send(msg);
我的问题是,当我在 utf-8 中编码主题时,我如何编码收件人地址,即。 new InternetAddress(address)
【问题讨论】:
为什么要对收件人地址进行编码? @MichaelLaffargue:由于邮件是外文的,因此收件人地址 @Romi:你从哪里得到你的电子邮件地址?数据库或一些属性文件?是address
还是String
?
【参考方案1】:
电子邮件地址应遵循 RFC822 标准
JavaMail 的 MimeMessage 使用 InternetAddress:
该类表示一个 Internet 电子邮件地址,其语法为 RFC822。典型的地址语法格式为“user@host.domain”或 "个人姓名
"。
RFC822 format 说:
请注意,RFC 822 将字符库限制为 ASCII。在 实践中,其他字符(例如 ä 或 é)通常在引号内起作用 用于注释目的的字符串(和 cmets),但不得 在适当的地址中使用。
地址的个人名称支持不同的字符集
InternetAddress 使用个人名称:
如果名称包含非 US-ASCII 字符, 然后名称将根据 RFC 使用指定的字符集进行编码 2047. 如果名称仅包含 US-ASCII 字符,则不进行编码并按原样使用名称。
要设置编码字符集,有一个InternetAddress#constructor。查看来源:
public InternetAddress(String address, String personal, String charset)
throws UnsupportedEncodingException
this.address = address;
setPersonal(personal, charset);
它只是调用setPersonal(..),因此请选择最方便的方式。
要查找字符集,请使用Charset.forName()。
【讨论】:
什么是个人,我的地址中有特殊字符,显示不正确 @Romi 个人名称是电子邮件地址的名称,例如:"Евгений Мельник"我这样做了,其中 addressString 是带有 NLS 字符的电子邮件地址:
InternetAddress address = new InternetAddress(addressString);
String personal = address.getPersonal();
if(personal != null)
address.setPersonal(personal, "utf-8");
getPersonal()
获取原始个人姓名(如果有),因为如果您使用单个字符串构建 InternetAddress,或者使用 InternetAddress.parse()
,您将不会在单独的字符串中包含个人姓名部分:
公共 java.lang.String getPersonal()
获取个人姓名。如果名称按照 RFC 2047 进行编码,则会对其进行解码并转换为 Unicode。如果解码或转换失败,则原样返回原始数据。
然后setPersonal()
再次设置字符串,但这一次告诉InternetAddress
对其进行编码:
public void setPersonal(java.lang.String name, java.lang.String charset)
设置个人姓名。如果名称包含非 US-ASCII 字符,则将根据 RFC 2047 使用指定的字符集对名称进行编码。如果名称仅包含 US-ASCII 字符,则不进行编码并按原样使用名称。
【讨论】:
以上是关于如何对 Internet 地址进行编码的主要内容,如果未能解决你的问题,请参考以下文章