【问题标题】:Java mail vs. MySQL: probably a character encoding issue?Java 邮件与 MySQL:可能是字符编码问题?
【发布时间】:2011-03-11 01:48:21
【问题描述】:

我目前正在使用 JDBC 和 executeQuery 从 MySQL 数据库中获取数据。其中一个字段包含我通过ResultSet.getString("emailBody") 获取的电子邮件内容。

使用以下代码(简化)发送邮件:

Properties props = new Properties();
Session session;
Message message;

props.put("mail.smtp.host", "mysmtpserver");
session = Session.getInstance(props, null);
message = new MimeMessage(session);

message.setFrom(new InternetAddress("myaddress@example.com", "System");
message.setSubject("Automatic notification");

message.setRecipient(RecipientType.BCC,
        new InternetAddress("admin@example.com", "Admin Distribution List"));
// email contains the previously fetched value
message.setContent(email, "text/plain"); 
Transport.send(message);

这适用于所有字符,包括德语变音符号、方括号等。不幸的是,以下字符失败:

– which is displayed as ? on the mail clients
" which becomes \"
' which is sent as \'

我在网上找不到任何有用的东西,请指教。非常感谢!

【问题讨论】:

    标签: java mysql email jdbc


    【解决方案1】:

    您的邮件可能以 iso-8859-1 编码发送,其中不包括短划线的代码点。您可以尝试在 setContent 调用中将字符集指定为 utf-8:

    message.setContent(email, "text/plain; charset=utf-8");
    

    但这并不能解释您所看到的引号问题,但我想这实际上是两个不同的问题。

    【讨论】:

      【解决方案2】:

      " turing into \" 和 'turing into \' 是逃避问题。在插入期间,这些值被转义,因此不会破坏 sql 插入查询。在选择期间,您必须取消转义它们。 (不知道具体的java函数...)

      【讨论】:

      • 我也想过,但是在搜索“jdbc java unescape string”时找不到有用的东西...
      • 你不应该在另一端看到转义的字符串。如果你这样做了,那你就做错了。
      • 字符串 a = "\";被转义并认为它是控制代码的一部分。这是因为 \t、\n、\u1234 序列等等。字符串 a = "\\";将显示一个 \.
      • 数据库中的条目是由我无权访问的不同系统创建的。我同意,这似乎是一个多重转义问题,我通过再次手动转义来解决。
      【解决方案3】:

      引号问题正在发生,因为在某些时候字符串被转义了太多次。

      如果您手动从数据库中选择字符串,这是否会返回视觉转义的引号?如果是这样,您在插入数据库之前已经转义了太多次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 2010-12-13
        相关资源
        最近更新 更多