やること
Apache Tika Parsers
を用いてファイルのCharset
(文字コード)に関わらず、Java
のString
として読み込みます。
Apache Tika Parsers
は以下からご利用ください。
やり方
今回はUniversalEncodingDetector()
を使ってCharset
を取得し、Charset
に合わせてString
のコンストラクタを呼び出しています。
例ではTikaInputStream
の初期化にInputStream
などを利用していますが、やり方はいくつか有るので各ドキュメントをご参照下さい。
String
の初期化などもそうです。
// MetadataはKotlinと名前被りが有るため改名して用いる
import org.apache.tika.metadata.Metadata as TikaMetadata
/**
* 入力ファイルの文字エンコード
*/
fun getCharset(input: InputStream, metadata: TikaMetadata): Charset? {
val encordingDetector = UniversalEncodingDetector()
return TikaInputStream.get(input)
.let { encordingDetector.detect(it, metadata) }
}
val metadata = TikaMetadata()
val charset = getCharset(/* 何らかのInputStreamなど */, metadata)
if (charset == null) throw Exception("文字コードが取得できませんでした。")
val result = String(/* ByteArrayなど */, charset)
試した感じ
Shift-JIS
やUTF-8
のボム有り/無しなどは正常に取り扱えました。
ただ、日本語があまり含まれていないShift-JIS
の場合、解析に失敗して文字化けすることが有りました。
前情報無しでの文字コード解析は統計的手法に頼るしか無いため、どの手法でもどうしようもない問題だとは思いますが、失敗が有りうることは念頭に置くべきかなと思います。