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

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

ただいまの
回答率

90.53%

  • Java

    15540questions

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

  • JSON

    1418questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • 文字コード

    229questions

    文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

JAVA 日本語(漢字含む)の文字化け 改善策

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 8,802

taikikki

score 5

略)
int size=via.size();
  StringBuilder a=new StringBuilder();
  a.append("{\n\"source\":");
  a.append(via.get(0));
  a.append(",\n");
  for(int si=0;si<size-3;si++){
    a.append("\"via");
    a.append(si);
    a.append("\":");
    a.append(via.get(si+1));
    a.append(",\n");
  }
  a.append("\"target\":");
  a.append(via.get(size-2));
  a.append(",\n");
  a.append("\"cost\":");
  a.append(via.get(size-1));
  a.append(",\n");
  a.append("},");
  //System.out.println(a);//syuturyoku
  String string=new String(a);
  try{
    File file = new File("c://java//test.json");

    FileWriter file_w = new FileWriter(file,true);

    file_w.write(string);
    file_w.write("\n");
    file_w.close();
  }
  catch(IOException e)
  {
    System.out.println(e);
  }
略)

上のコードを実行すると下のような出力結果になります。

{
"data":[
{
"source":35,
"via0":-1,
"target":35,
"cost":0,
},
{
"source":35,
"via0":0,
"via1":2,
"target":36,
"cost":87,
},
{
"source":35,
"via0":0,
"via1":1,
"via2":3,
"target":37,
"cost":78,
},・・・以降も続く

しかし、souceとtargetの値に漢字を含む日本語を用いたいのですが、

  a.append("{\n\"source\":");
  if(via.get(0)==35){
    s_tmp = "入口";
  }
  a.append(s_tmp);
  //a.append(via.get(0));
  a.append(",\n");
  for(int si=0;si<size-3;si++){
    a.append("\"via");
    a.append(si);
    a.append("\":");
    a.append(via.get(si+1));
    a.append(",\n");
  }
  a.append("\"target\":");
  if(via.get(size-2)==36){
    t_tmp = "カリブの海賊";
  }
  a.append(t_tmp);
  //a.append(via.get(size-2));
  a.append(",\n");
  a.append("\"cost\":");
  a.append(via.get(size-1));
  a.append(",\n");
  a.append("},");

このように変更すると、


エラー

C:\java>javac Dijkstra3.java
Dijkstra3.java:258: エラー: この文字は、エンコーディングMS932にマップできません
t_tmp = "繧ォ繝ェ繝悶?ョ豬キ雉?";
^
Dijkstra3.java:258: エラー: この文字は、エンコーディングMS932にマップできません
t_tmp = "繧ォ繝ェ繝悶?ョ豬キ雉?";


とエラーが出てしまいます。
調べて"javac -encoding UTF-8 ファイル名でやると実行はできるのですが、日本語(漢字)を含んだところが文字化けしてしまいます。

{
"data":[
{
"source":����,
"via0":-1,
"target":b,
"cost":0,
},
{
"source":����,
"via0":0,
"via1":2,
"target":�J���u�̊C��,
"cost":87,
},
{
"source":����,
"via0":0,
"via1":1,
"via2":3,
"target":b,
"cost":78,
},
{
"source":����,
"via0":0,
"via1":1,
"via2":3,
"target":b,
"cost":86,
},


どうすれば文字化けせずにjsonファイルで出力させられるでしょうか。
回答よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+3

Windowsでよく混乱するMS932とUTF-8ですがその点コメントします。

Javaプログラムの内部ではOSにかかわらず文字(char, String)は常にUTF-16で扱われます。ソースコードをどのエンコーディングで書いても正しくコンパイルしさえすればそうなります。

Java->外部ファイルへ出力するときはFileOutputStreamのようにエンコーディングを指定できないものはプログラムの起動元のエンコーディングが仮定されます。Windowsのコマンドプロンプトからの起動だと標準的にはMS932になると思います。
OutputStreamWriterのようにエンコーディングを指定できるクラスはそれに指定したとおりに出力されます。Windows上だとMS932で出力すればコマンドプロンプトやメモ帳では文字化けは起こらないはずです。UTF-8で出力したときにちょっと注意が必要です。

JavaでUTF-8のファイルを出力した場合、コマンドプロンプトからtypeあるいはメモ帳で開くと文字化けすると思いますがそれはこれらのプログラムがMS932を仮定しているからです。しかしメモ帳の方は先頭にBOM文字'\uFEFF`を出力してやることで文字化けせずに見ることができます。メモ帳が先頭のBOMをみて「このファイルはUTF-8らしい」ということを認識してくれるからです。

ただし、UTF-8の先頭のBOM文字はどんなプログラムでもうまく解釈してくれるとは限らず、また計算機プログラミングの世界一般では広く推奨はされてないらしいです。(このあたりがWindowsで混乱を招く一因だと思います。)

jsonはUTF-8/MS932どちらで出力すべきものかは質問者さんの目的次第ですが

  • Windows-31j(JavaではMS932ともいう。要するにMicrosoft社独自Shift-JIS)でよいなら
FileWriter fw = new FileWriter();
fw.write("日本語");

=>メモ帳でそのまま開けます。

  • UTF-8で先頭にBOMがあってもいいなら(あまりお勧めできないかも知れません)
FileOutputStream fos = new FileOutputStream("...");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
osw.write('\uFEFF');
osw.write("日本語");

=>メモ帳でそのまま開けます。

  • UTF-8で先頭にBOMがあってはまずいなら
FileOutputStream fos = new FileOutputStream("...");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
osw.write("日本語");


=>メモ帳で開くと文字化けします(メモ帳にexploreからD&Dするとなぜか文字化けせずに見ることができたりするので不思議ですが)。UTF-8で中身を見ることができるエディターを使うかブラウザーへD&Dして見るという手を使うと文字化けを回避できると思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/27 16:02

    無事文字化けが解決しました。
    ありがとうございました。

    キャンセル

+3

調べて"javac -encoding UTF-8 ファイル名でやると実行はできるのですが、日本語(漢字)を含んだところが文字化けしてしまいます。

とのことですが、出力されたファイルはUTF-8で表示すれば正しく日本語も表示されるのではないでしょうか。

もし、ファイルをMS932で出力したいのであれば、FileWriterではなくOutputStreamWriterを使用すればよいと思います。

File file = new File("c://java//test.json");
FileWriter file_w = new FileWriter(file,true);
↓↓↓
FileOutputStream stream = new FileOutputStream("c://java//test.json");
OutputStreamWriter file_w = new OutputStreamWriter(stream, "MS932");
file_w.write(string);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/27 16:01

    無事文字化けが解決しました。
    ありがとうございました。

    キャンセル

0

日本語を記述しているファイルの文字コードがMS932になっていませんか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

同じタグがついた質問を見る

  • Java

    15540questions

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

  • JSON

    1418questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • 文字コード

    229questions

    文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。