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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4762閲覧

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

Jonconan

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/12/24 04:52

編集2015/12/24 05:18

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

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

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

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

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

lang

1String command = "cmd.exe /c echo " + returnString + " | kakasi -" + cmd + " -i utf-8 -o utf-8"; 2System.out.println(command); 3Runtime rt = Runtime.getRuntime(); 4Process proc = null; 5try { 6 proc = rt.exec(command); // 文字コードが狂わされてる(と睨んだ) 7} catch (IOException e1) { 8 // TODO 自動生成された catch ブロック 9 e1.printStackTrace(); 10} 11 12InputStream is = proc.getInputStream(); 13BufferedReader in = new BufferedReader(new InputStreamReader(is)); 14String line = null; 15try { 16 while ((line = in.readLine()) != null) { 17 System.out.println("line : " + line); 18 return line; 19 } 20} catch (IOException e) { 21 // TODO 自動生成された catch ブロック 22 e.printStackTrace(); 23} 24return 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になってるので、文字化けしても仕方ないですが…
文字コード設定

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuwow

2015/12/24 05:12

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

2015/12/24 05:16

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

2015/12/24 05:19

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

回答3

0

ベストアンサー

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 06:52

編集2015/12/24 07:53
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jonconan

2015/12/24 08:46

アドバイスありがとうございます。 eripong様の言うとおりに、echoからkakasi直接実行に切り替えたところ、上手くいきました。 助かりました、ありがとうございます! 他にも、アドバイスをくれた皆様に改めてお礼申し上げます!!
guest

0

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

投稿2015/12/24 05:42

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hyper-drums-ko

2015/12/24 05:51

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

2015/12/24 06:39

なるほど、確かに言われてみれば…という感じです。 どうしてそれに気付けなかった私… 質問に質問でお返しするようで申し訳ないのですが、その場合、これで大丈夫ですか? InputStream is = proc.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
ipadcaron

2015/12/24 06:46

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

0

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

java

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

投稿2015/12/24 05:39

hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jonconan

2015/12/24 06:35

アドバイスありがとうございます。 しかし、やってみましたが、出力結果は次の通りになってしまいました…。 cmd.exe /c chcp 65001 && echo 入力テスト | kakasi -w -i utf-8 -o utf-8 line : Active code page: 65001
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問