Scala Play 2.4.x 通过异常处理扩展字符 (MySQL) 到 Java 邮件

Scala Play 2.4.x handling extended characters through anorm (MySQL) to Java Mail

我的印象是 UTF-8 是所有问题的答案:0

问题:使用 Play 的惯用形式处理从网页(基本 HTML 文本区域输入字段)通过 Anorm 抽象层转到 MySQL 数据库(所以一切正常 escaped),然后读取数据库以收集该数据并使用 JavaMail API 创建一封电子邮件,以发送带有备用字符(例如 é 等重音字符)的 HTML 电子邮件。 (我会 post 更多,但我怀疑我们也可能在这里得到奇怪的人工制品——我可能会在下面的评论中尝试)

我可以使用一组适度的字符并创建一封文本电子邮件(通过 Atom 编辑并直接在代码级别放入流中),它以电子邮件的形式发送,其中包含我选择的所有字符.

我还没有系统地研究角色我只是使用相对随机的抽样作为初始测试。

我将同一组字符放入文本字​​段并尝试将它们保存到数据库中,但我只能保存大约五分之一或更少的字符。

错误如下所示:

SQLException: Incorrect string value: '\xC4\x93\x0D\x0A\x0D\x0A...' for column 'content' at row 1

我怀疑我即将学习大量关于 Play and/or UTF-8 或 HTML 或链中某些部分的新信息,这些信息将脱离 rails.

我的问题是:是否有惯用的 Play 示例说明如何通过 Anorm 端到端处理 UTF-8 并进入 Java 邮件?

(我想我有点期待它是 "built-in" 但后来我期待更多的东西也被融入到核心产品中......)

我 want/need 电子邮件部分的 TEXT 和 HTML 路径。 (我可以写两个,它们都工作正常——问题是通过上面指出的通道移动替代字符)。

我目前正在查看这个是否可能是一个答案:

https://objectpartners.com/2013/04/24/html-encoding-utf-8-characters/

但是目前遇到了这个障碍...

How to turn off specific Implicit's in Scala that prevent code from compiling due to overloaded methods?

这似乎是一个有希望的候选人——我现在正在对其进行全面研究。

import org.apache.commons.lang3._

def htmlEncode(input: String) = htmlEncode_sb(input).toString    

def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = {
    stringBuilder.synchronized {
      for ((c, i) <- input.zipWithIndex) {
        if (CharUtils.isAscii(c)) {
          // Encode common HTML equivalent characters
          stringBuilder.append(StringEscapeUtils.escapeHtml4(c.toString()))
        } else {
          // Why isn't this done in escapeHtml4()?
          stringBuilder.append(s"""&#${Character.codePointAt(input, i)};""")
        }
      }
      stringBuilder
    }
  }

为了让它在 Play 中运行,您需要在 build.sbt 文件中使用它

  "org.apache.commons" % "commons-lang3" % "3.4",

这篇博客 post 引导我编写代码:https://objectpartners.com/2013/04/24/html-encoding-utf-8-characters/

更新:确认它确实可以端到端工作。

网页输入作为 TextArea 保存到 MySQL 由 Anorm 转义的数据库,从数据库中重新读取并显示在网页的 TextArea 中,扩展字符(视觉上)准确地显示为输入。

您需要在 Twirl 模板中调用 @Html(htmlContentString) 以将其重新呈现为原始 HTML 但浏览器 (Safari 8.0.7) 显示的正是我在往返于数据库。

一个警告 -- 它创建机器可读 HTML 而不是人类可读 HTML。如果它不对尖括号等进行编码,那么它看起来更像我们期望的 HTML 就好了。我确定接下来会添加一个模式匹配块来排除那个:)