質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.72%

【Java】kakasi を使って文字列変換を行い、結果をUTF8で表示したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,191

Jonconan

score 14

kakasiを使って、文字列の単語分割、ひらがな変換を行っているのですが、文字コードに苦しめられております。

【 解決したいこと 】
入出力において、UTF8で表示したい

Java上でkakasiを呼び出し、その結果をEclipseで出力したいのですが、どうしても文字化けしてしまい困っています。
Eclipseの出力結果(実行構成→共通)は確かにUTF-8になっているので、Eclipseの設定間違いという線は無いと思います。
Eclipse実行構成画面

kakasi
http://kakasi.namazu.org/index.html.ja

【 ソースコード 】
ごめんなさい、補足です。
cmdは他関数から指定できるようにしていまして、今回で言うと、cmdには w が入っています。

String command = "cmd.exe /c  echo " + returnString + " | kakasi -" + cmd + " -i utf-8 -o utf-8";
System.out.println(command);
Runtime rt = Runtime.getRuntime();
Process proc = null;
try {
  proc = rt.exec(command); // 文字コードが狂わされてる(と睨んだ)
} catch (IOException e1) {
  // TODO 自動生成された catch ブロック
  e1.printStackTrace();
}

InputStream is = proc.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String line = null;
try {
  while ((line = in.readLine()) != null) {
    System.out.println("line : " + line);
    return line;
  }
} catch (IOException e) {
  // TODO 自動生成された catch ブロック
  e.printStackTrace();
}
return null;

【 実行結果 】
cmd.exe /c  echo 入力テスト | kakasi -w -i utf-8 -o utf-8
line : �(I|(B�(IM(B�e�X�g

【 解決したいこと 】
入出力において、UTF-8で表示したい
実際に実行した結果として以下のようになれば成功です。
cmd.exe /c  echo 入力テスト | kakasi -w -i utf-8 -o utf-8
line : 入力 テスト

ちなみに、Java上ではなく、直接端末で動かしたときの結果がこちらです。
端末上実行画面
……まぁ、端末上では文字コードShift-Jisになってるので、文字化けしても仕方ないですが…
文字コード設定

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ikuwow

    2015/12/24 14:12

    ソースコードの部分はMarkdown記法でシンタックスハイライトしていただけると助かります

    キャンセル

  • Jonconan

    2015/12/24 14:16

    すみません、teratailを使い始めてまだ日が浅いもので…
    修正しましたが、これであってますでしょうか…?

    キャンセル

  • ikuwow

    2015/12/24 14:19

    ありがとうございます。とても見やすくなりました。

    キャンセル

回答 3

checkベストアンサー

+1

returnStringをkakasiに渡したいのなら、
echoはやめて、kakasiを直接実行し、
proc.getOutputStream()したOutputStreamreturnStringを書き込んだ方が、
文字コードをコントロール出来て良いかと思います。

動作確認出来ていませんが、以下の様なコードになると思います。

String command = "kakasi -" + cmd + " -i utf-8 -o utf-8";
-(略)-
OutputStream os = proc.getOutputStream();
InputStream is = proc.getInputStream();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String line = null;
try {
  out.write(returnString);
  out.newLine();
  while ((line = in.readLine()) != null)
-(略)-

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 17:46

    アドバイスありがとうございます。
    eripong様の言うとおりに、echoからkakasi直接実行に切り替えたところ、上手くいきました。
    助かりました、ありがとうございます!

    他にも、アドバイスをくれた皆様に改めてお礼申し上げます!!

    キャンセル

0

cmd.exe 経由で実行しているので、エンコーディングを UTF-8 にしないといけないのではないでしょうか。

String command = "cmd.exe /c chcp 65001 && echo " + returnString + " | kakasi -" + cmd + " -i utf-8 -o utf-8";

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 15:35

    アドバイスありがとうございます。
    しかし、やってみましたが、出力結果は次の通りになってしまいました…。

    cmd.exe /c chcp 65001 && echo 入力テスト | kakasi -w -i utf-8 -o utf-8
    line : Active code page: 65001

    キャンセル

0

最終成果物として utf-8 のデータであること、
ならば、コマンドで外部プロセスとして実行する場合は、コマンドプロンプトの出力結果を、inputstreamで受けるので、ここは素直にsjis で受けて、java のファイル出力なりで、utf-8 に変換すれば良いのでは。
kakasi のオプションにutf-8 ではなくて、何も指定しないか、sjis を指定すればok です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/24 14:51

    > kakasi のオプションにutf-8 ではなくて、何も指定しないか、sjis を指定すればok です
    こちらのほうがスマートですね。。。

    キャンセル

  • 2015/12/24 15:39

    なるほど、確かに言われてみれば…という感じです。
    どうしてそれに気付けなかった私…

    質問に質問でお返しするようで申し訳ないのですが、その場合、これで大丈夫ですか?

    InputStream is = proc.getInputStream();
    BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));

    キャンセル

  • 2015/12/24 15:46

    inputstreamreader の第二引数は、入力文字列の文字コードを指定する、ですから、sjis ですよね。
    文字コードが一杯なんで気をつけたいところです。
    windows コマンドは基本、sjisやms932、java 内部はutf16です。
    eclipse のoutput コンソールも、utf16 でそのまま出力できます。
    このjava の処理結果が html ならば、そこで、utf8 に変換、
    ftpなどの転送ファイルになるならそこでutf8に変換となります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.72%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる