2013-05-08 53 views
2

我已將我的Pl​​ay2 + 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對象字符集編碼我的參數? 顯然我做錯了什麼,但我無法弄清楚!

回答

0

你需要複製parse.multipartFormData功能的實現,改變從utf-8的decodings到iso-8859-1,並用它在你的行動。

問題在於,默認情況下,播放使用UTF-8解碼所有內容,除了實現自己的解析器外,沒有辦法改變它。

相關問題