読者です 読者をやめる 読者になる 読者になる

RubyのString#dumpの実装

scala

Scalaで文字列をコンソールに出力しようとしたときに
マルチバイト文字が入っていたりすると
文字化けをして非常によろしくない。
RubyだとString#dumpの結果を出力すればいいのですが、
Javaにそういうものはないらしい。
Scalaにもなさそうだ。
というわけで、作成してみた。
誰かscala好きな人がネタにして
短くしてくれると嬉しいです。

object StringDump{
  def main(args: Array[String])={
    val str:String=args(0)
    println(dump(str))
  }
  def dump(str:String):String={
    var res="";
    res=res+"\""
    str.getBytes("UTF-8").foreach(arg => {
      if(arg==34){
        res=res+"\\\""
      }else if(arg==92){
        res=res+"\\\\"
      }else if(arg>=32 && arg <= 126){
        val bytes:Array[Byte]=Array(arg)
        val str=new String(bytes)
        res=res+str
      }else{
        if(arg<0){
          res=res+"\\%03o".format(256+arg)
        }else{
          res=res+"\\%03o".format(arg)
        }
      }
    })
    res=res+"\""
    res
  }
}

これをStringDump.scalaという名前で保存して、

% scalac StringDump.scala
% scala StringDump "abcはろー\"def"

とやると、

"abc\343\201\257\343\202\215\343\203\274\"def"

と出力されます。
Rubyでやると

% ruby -e 'p "abcはろー\"def"'
"abc\343\201\257\343\202\215\343\203\274\"def"

となるので、あってるようだ。
traitにしてStringにmix-inとかできたら楽だろうな。