在解析来自Sendgrid的邮件时,将Play2 + Scala中的MultipartFormData的ISO-8859



我已经将我的Play2+Scala应用程序连接到Sendgrid Parse Api,我真的很难解码和编码电子邮件的内容。

由于电子邮件可以是不同的编码,Sendgrid为我们提供了一个JSON对象字符集:

{"to":"UTF-8","cc":"UTF-8","subject":"UTF-8","from":"UTF-8","text":"iso-8859-1","html":"iso-8859-1"}

在我的测试用例"text""Med Vänliga Hälsningar Jakobs Webshop"如果我从multipart请求中提取并打印出来:

Logger.info(request.body.dataParts.get("text").get)

:

Med V?nliga H?lsningar Jakobs Webshop

好的,那么对于来自Sendgrid的给定信息,让我们修复字符串,使其为UTF-8

def parseMail = Action(parse.multipartFormData) {
    request => {
    val inputBuffer = request.body.dataParts.get("text").map {
        v => ByteBuffer.wrap(v.head.getBytes())
    }
    val fromCharset = Charset.forName("ISO-8859-1")
    val toCharset = Charset.forName("UTF-8")
    val data = fromCharset.decode(inputBuffer.get)
    Logger.info(""+data)
    val outputBuffer = toCharset.encode(data)
    val text = new String(outputBuffer.array())
    // Save stuff to MongoDB instance
}

结果是:

Med V�nliga H�lsningar Jakobs Webshop

这很奇怪。这应该行得通。我想知道在体解析器parse.multipartFormData和datapart处理程序中实际发生了什么:

def handleDataPart: PartHandler[Part] = {
        case headers @ PartInfoMatcher(partName) if !FileInfoMatcher.unapply(headers).isDefined =>
          Traversable.takeUpTo[Array[Byte]](DEFAULT_MAX_TEXT_LENGTH)
            .transform(Iteratee.consume[Array[Byte]]().map(bytes => DataPart(partName, new String(bytes, "utf-8")))(play.core.Execution.internalContext))
            .flatMap { data =>
              Cont({
                case Input.El(_) => Done(MaxDataPartSizeExceeded(partName), Input.Empty)
                case in => Done(data, in)
              })
            }(play.core.Execution.internalContext)
      } 

当使用数据时,创建一个编码为utf-8的新字符串:

.transform(Iteratee.consume[Array[Byte]]().map(bytes => DataPart(partName, new String(bytes, "utf-8")))(play.core.Execution.internalContext))

这是否意味着我的ISO-8859-1编码的字符串文本在解析时用utf-8编码?如果是这样,我应该如何创建我的解析器来解码,然后根据提供的JSON对象字符集编码我的参数?很明显,我做错了什么,但我不知道!

您需要复制解析的实现。multipartFormData函数,将解码从utf-8更改为iso-8859-1,并在您的Action中使用。

问题是play在默认情况下解码UTF-8的所有内容,并且没有办法改变这一点,除了实现自己的解析器。

您是否尝试将默认编码更改为UTF-8?

从Scala解释器中打印Unicode

最新更新