ファイルに、utf-8で日本語文字列を入力して保存し、あとでそれを読み込んでJLabelに表示すると文字化けしてしまいます。どうすれば良いでしょうか
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
自己解決
何が原因かわからないが、なんか適当に書き直したらうまくいった。特に変更した点はないはずなんだけど・・・
投稿2015/11/09 01:21
総合スコア476
0
ファイルの読み込みにエンコーディングを指定しない場合、システムのデフォルトエンコーディングで読み込まれます。
デフォルトエンコーディングがUTF-8でない環境(Windows)があるので、ファイルの読み込みは明示的にエンコーディングを指定するようにしてください。
以下のコードは、ファイルから明示的にUTF-8で読み込む例です。
lang
1// Java7以降の書き方 2 3import java.io.*; 4import java.nio.charset.StandardCharsets; 5import javax.swing.*; 6 7File file = new File("data.txt"); 8try (BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) { 9 String s = r.readLine(); // data.txtの1行目を取得 10 JLabel jLabel = new JLabel(s); 11} catch (IOException e) { 12 e.printStackTrace(); 13}
投稿2015/11/03 11:31
編集2015/11/03 11:33総合スコア9388
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("過去データ.txt"), "UTF-8"));
こう書いてますが、どう違うのでしょうか?
2015/11/03 11:57
そこに関しては有ってますね。
それ以外の箇所だとすると、情報が足りませんので、いくつか教えてください。
・OSとそのバージョン
・どうやってJavaコードをコンパイル・実行しているか(Eclipse?)
2015/11/03 12:28
Windows8.1 64bit
テキストエディタとコマンドプロンプトで作ってます。
```java
JPanel[] ap;
JLabel[] disp;
JButton[] addLog;
String[][] mon;
String[] ans;
afl(){
int i = 0;
int a = 0;
JPanel base = new JPanel();
base.setLayout(new BoxLayout(base, BoxLayout.Y_AXIS));
try{
String lin = "";
BufferedReader ln = new BufferedReader(new FileReader("過去データ.txt"));
while(true){
lin = ln.readLine();
if(lin == null) break;
else if(lin.startsWith("ANS=")) a ++;
}
ln.close();
ap = new JPanel[a];
disp = new JLabel[a];
addLog = new JButton[a];
mon = new String[a][10];
ans = new String[a];
a = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("過去データ.txt"), "UTF-8"));
String line = br.readLine();
while(line != null){
if(!line.startsWith("ANS=")){
System.out.println("if(!line.startsWith(\"ANS=\")){");
mon[i][a] = line;
ap[i] = new JPanel();
ap[i].setLayout(new BoxLayout(ap[i], BoxLayout.Y_AXIS));
a ++;
} else{
System.out.println("} else{");
ans[i] = line.substring(5);
disp[i] = new JLabel(Mondai(i) + ", " + ans[i]);
addLog[i] = new JButton("追加");
addLog[i].addActionListener(this);
addLog[i].setActionCommand("" + i);
ap[i].add(disp[i]);
ap[i].add(addLog[i]);
base.add(ap[i]);
a = 0;
i ++;
}
line = br.readLine();
}
} catch(IOException e){}
add(base);
}
private String Mondai(int i){
String m = "";
int mi = 0;
while(mon[i][mi] != null){
m += mon[i][mi] + "\n";
mi ++;
}
return m;
}
```
2015/11/03 13:17
Windows8.1 64bitで確認してみましたが、文字化けは再現しませんでした。
プログラム実行時に特別なオプションを指定していなければ、特に文字化けする要素は無さそうです。
もう一度、「過去データ.txt」がUTF-8で保存されているかどうか確認してみてください。
おなじファイル名で別のデータがあったりとかしませんか?
後は、特殊な文字を使っていますか?全部ひらがなとかでも文字化けしますか?
2015/11/03 15:12
入力は、PrintWriterをつかって、
try(PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("過去データ.txt", true), "UTF-8")))){
としてあります。
2015/11/03 15:31
書き込みコードもそれ自体には問題なさそうです。
追記モードになっているので、以前にまちがって書き込んだりしたのが残っている可能性はありませんか?
過去データ.txtをテキストエディターで開くとちゃんと表示できますか?
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。