将ISO-8859-1转换为UTF-8,用于Play2+中的MultipartFormData;分析来自Sendgrid的电子邮件时使用Scala

将ISO-8859-1转换为UTF-8,用于Play2+中的MultipartFormData;分析来自Sendgrid的电子邮件时使用Scala,scala,encoding,playframework,playframework-2.1,sendgrid,Scala,Encoding,Playframework,Playframework 2.1,Sendgrid,我已经将我的Play2+Scala应用程序连接到,我真的很难解码和编码电子邮件的内容 由于电子邮件可能采用不同的编码,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” 如果我从多部分请

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

由于电子邮件可能采用不同的编码,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” 如果我从多部分请求中提取并打印出来:

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
所以这很奇怪。这应该行得通。 我想知道body解析器
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对象字符集对参数进行编码?
很明显我做错了什么,但我想不出来

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


有关详细信息,请参见此问题:

您需要复制parse.multipartFormData函数的实现,将解码从
utf-8
更改为
iso-8859-1
,并在操作中使用它


问题是play默认使用
UTF-8
解码所有内容,除了实现自己的解析器之外,没有其他方法可以改变这一点。

Hello!谢谢你的回答,但是-D参数没有运气