RubyのString#dumpの実装
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とかできたら楽だろうな。