我已將我的Play2 + Scala應用程序連接到Sendgrid Parse Api,我真的很費力地解碼和編碼電子郵件的內容。當從Sendgrid解析電子郵件時,在Play2 + Scala中將ISO-8859-1轉換爲UTF-8 for MultipartFormData
由於電子郵件,可以在不同的編碼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
所以這是很奇怪的。這應該工作。 我不知道究竟發生在身體解析器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)
}
當消耗一個新的String與編碼所創建的數據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對象字符集編碼我的參數? 顯然我做錯了什麼,但我無法弄清楚!
您好!謝謝你的回答,但沒有-D param的運氣 – jakob 2013-05-10 11:35:09