[scala]文字コードの自動認識
"JISAutoDetect"だと、シフトJISとかEUCは自動認識してくれるのだけれど、"UTF-8"だと認識してくれません。
なので、候補となる文字セットをすべて試して、文字化けが一番少ないのを探すようにしました。
もちろん、間違える可能性もあります。
/** * 文字セットを推測する。 * @param bytes バイト配列 * @param candidates 推測する文字セットの候補。要素は1つ以上であること。 * @return 推測した文字セット。candidatesのうちの1つを返す。 */ def guessCharset(bytes:Array[Byte], candidates:Seq[String]=Seq("UTF-8", "MS932", "EUC-JP")):String = { assert(candidates.size > 0, candidates) candidates.map{cs => // 文字列に変換し、65533の文字数を数える。(文字セット,個数) (cs, new String(bytes, cs).count(_.toInt == 65533)) }.minBy(_._2)._1 }
一応動くけれど、65533というマジックナンバーが入っていたり、タプルの._1や._2が出ているのがいまいち。