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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

文字コード

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

Q&A

解決済

4回答

3345閲覧

propertiesが文字化けしてしまう。

Pizzaking

総合スコア42

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

文字コード

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

0グッド

0クリップ

投稿2020/08/05 06:21

編集2020/08/08 10:44

前提・実現したいこと

Propertiesファイルの書き込みを自動化したい。

発生している問題・エラーメッセージ

propertiesファイルにJavaを使って内容を書き込んだ後に、メモ帳などで開くと以下のように文字化けしてしまう。

properties

1name=\u3059\u3059\u3081\u30ED\u30B1\u30C3\u30C8

実際にPropertiesファイルの書き込みをしている部分

Java

1try(FileOutputStream f = new FileOutputStream(folderpath.getText()+"\game.cfg"); 2 BufferedOutputStream b = new BufferedOutputStream(f)){ 3 Properties prop = new Properties(); 4 prop.setProperty("name", name.getText()); 5 prop.store(b, ""); 6 b.close(); 7 f.close(); 8 } catch ( IOException e ) { 9 e.printStackTrace(); 10 }

ソースコード内の変数にはすべて適切な値を代入しています。

補足情報(FW/ツールのバージョンなど)

Java10を使用しています。

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

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

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

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

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

ikadzuchi

2020/08/05 16:32

具体的にどのような化け方をするのですか?
Pizzaking

2020/08/08 09:16

返信が遅れてしまい申し訳ありません。 すみません。本体のPropertiesファイルを載せるのを忘れていました。 今編集して載せました
guest

回答4

0

java

1 public static void main(String[] args) throws IOException { 2 Properties prop = new Properties(); 3 prop.put("sampleValue", "日本語どうでしょう"); 4 5 FileWriter writer = new FileWriter(new File("save.properties"), Charset.forName("utf-8")); 6 prop.store(writer, ""); 7 8 }

投稿2020/08/11 04:43

A-pZ

総合スコア12011

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

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

0

ベストアンサー

see: Properties#store()

ストリームは、ISO 8859-1文字エンコーディングを使用して書き込まれる。

てことなので、game.cfgファイルはISO 8859-1でエンコーディングされています。


どうせソースを添付するなら、せめて簡単に実行できるようなものにしてほしいものです。

java

1import java.io.*; 2import java.util.*; 3public class xxHoge { 4 public static void main(String[] args) throws Exception { 5 try (FileOutputStream f = new FileOutputStream( "game.cfg"); 6 BufferedOutputStream b = new BufferedOutputStream(f)) { 7 Properties prop = new Properties(); 8 prop.setProperty("name", "あいうえお"); 9 prop.store(b, ""); 10 } 11 } 12} 13//# 14//#Sat Aug 08 21:19:09 JST 2020 15//name=\u3042\u3044\u3046\u3048\u304A



A-pZさんの回答にある、FileWriterはJava11から使えますね。

A-pZさんのを参考に、Java11以前向けに書き直してみました。store/loadでいけますね。失礼。

java

1import java.io.*; 2import java.nio.charset.Charset; 3import java.util.Properties; 4 5public class xxHoge { 6 public static void main(String[] args) throws Exception { 7 Properties prop = new Properties(); 8 prop.setProperty("name", "あいうえお"); 9 prop.put("sampleValue", "日本語どうでしょう"); 10 System.out.println(prop); 11 12 final File file = new File("hoge.properties"); 13 final Charset charset = Charset.forName("utf-8"); 14 System.out.println(file); 15 prop.store(new OutputStreamWriter(new FileOutputStream(file), charset), ""); 16 17 final Properties hoge = new Properties(); 18 hoge.load(new InputStreamReader(new FileInputStream(file), charset)); 19 System.out.println(hoge); 20 System.out.println(prop.equals(hoge)); 21 } 22} 23//{name=あいうえお, sampleValue=日本語どうでしょう} 24//hoge.properties 25//{name=あいうえお, sampleValue=日本語どうでしょう} 26//true
$ cat hoge.properties # #Tue Aug 11 16:48:24 JST 2020 name=あいうえお sampleValue=日本語どうでしょう

投稿2020/08/08 12:23

編集2020/08/11 07:58
shiketa

総合スコア4061

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

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

Pizzaking

2020/08/09 09:52

申し訳ありません。 UTF8などのほかのエンコードを使用して書き込むにはどうすればいいのでしょうか?
shiketa

2020/08/09 12:13 編集

ファイル形式にこだわらない。というのであれば、エンコーディングを指定できるstoreToXMLメソッド https://docs.oracle.com/javase/jp/10/docs/api/java/util/Properties.html#storeToXML(java.io.OutputStream,java.lang.String,java.lang.String) を使えばよろしいのではないでしょうか。読み込むときは対になるloadFromXMLメソッドで。 なんとしても`key = value`のファイル形式にこだわるのであれば、store()/loadメソッドの利用を諦めて、自力で入出力する。もしくは、Propertiesクラスの利用を諦めるかしかないのでは。
Pizzaking

2020/08/11 02:58

ありがとうございます。ベストアンサーにさせていただきます。
guest

0

文字コードが合ってないんでしょう、としか…

どんなコードを動かしてどんな内容を書き込んで、というところが最低はないとこれ以上のアドバイスはのぞめないかと思いますが、そもそもメモ帳で開くべきではないのでは?とも思います。

追記を見て。
おそらくそうじゃないかと思ってましたが、それ、文字化けじゃないです。
「properties 文字化け」で調べてください。
文字化けでないことがわかります。

投稿2020/08/05 06:32

編集2020/08/08 13:01
m.ts10806

総合スコア80875

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

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

0

開いている文字コードが違うからではないでしょうか?
javaを何で記述しているかわかりませんが

メモ帳→ファイル→開く

でファイル名の欄の下に文字コードという欄があると思うので
propertiesファイルがUTF-8ならUTF-8、JISならJISにしましょう。
そこを変更すれば大丈夫なのではないでしょうか?

投稿2020/08/05 06:31

syugaaburesu

総合スコア35

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問