LoginSignup
1
0

More than 3 years have passed since last update.

【Java】Apathce TikaでCharsetを取得する/CharsetからStringを初期化する【Kotlin】

Last updated at Posted at 2020-06-11

やること

Apache Tika Parsersを用いてファイルのCharset(文字コード)に関わらず、JavaStringとして読み込みます。

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-JISUTF-8のボム有り/無しなどは正常に取り扱えました。
ただ、日本語があまり含まれていないShift-JISの場合、解析に失敗して文字化けすることが有りました。

前情報無しでの文字コード解析は統計的手法に頼るしか無いため、どの手法でもどうしようもない問題だとは思いますが、失敗が有りうることは念頭に置くべきかなと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0