如何对 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 个人名称是电子邮件地址的名称,例如:"Евгений Мельник" ,其中第一部分是姓名,第二部分是地址。【参考方案2】:

我这样做了,其中 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 地址进行编码的主要内容,如果未能解决你的问题,请参考以下文章

域名和IP地址的转换工作是怎么进行的?

使用 sklearn 对多个特征进行编码 [关闭]

如何对非标准业务地址进行地理编码

如何在没有来自脚本的 Internet 连接的情况下在 Python 中转发地理编码?

如何通过谷歌地图 iOS API 对地址进行地理编码?

如何一次对一组 200 个地址进行地理编码