Shift-jis等の他の文字エンコーディングでレスポンスを返したい場合の方法を紹介
とりあえず、今回はLiftRules.responseTransformersを使用して、NodeResponseの文字エンコーディングを変更する方法紹介します。
1. Responseの定義
import net.liftweb.http.{LiftResponse,InMemoryResponse}
import _root_.scala.xml._
import net.liftweb.util.AltXML
case class MyXHtmlResponse(out : Node,encoding : String) extends LiftResponse{
def xmlDeclare = "\n"
var headers :List[(String,String)] = List()
var code = 200
def toResponse = {
val sb = new StringBuilder(64000)
sb.append(xmlDeclare)
AltXML.toXML(out, _root_.scala.xml.TopScope,
sb, false, false, false)
sb.append(" \n ")
val ret = sb.toString
val h : List[(String,String)] =
("Content-type","application/xhtml+xml;charset=" + encoding) :: headers.filter {
h => h._1.toLowerCase != "content-type"
}
InMemoryResponse(ret.getBytes(encoding), h, List(), code)
}
}
XmlNodeResponseなどは、現在の時点では文字エンコーディングがUTF-8直書きとなっているので、独自に文字コードを変えられるResponseを作成。(なお、ガラケー向けに作る途中のものなので、Cookieなどは無視してます。)
2. Responseの変換メソッドを定義
def convertResponse(response : LiftResponse) : LiftResponse = {
response match {
//
case r : NodeResponse => {
MyXHtmlResponse(r.out,"shift-jis")
}
case _ => response
}
NodeResponseの時のみ変換を行う。
3. 変換メソッドを登録
//Boot時に行う
LiftRules.responseTransformers.append(convertResponse)
Return none utf-8 response with lift framework.