

Eclipseでapplication.propertiesのファイルをUTF-8に変えたところ、  
下記で取得すると文字化けしてしまいます。  
文字化けせずに取得する方法はありますでしょうか。

[code]

    ResourceBundle bundle = ResourceBundle.getBundle("application");
    String test = bundle.getString("test");
    
[/code]

★application.propertiesは下記のとおり

[code]

    test=テストです。
    
[/code]

こちらをためしてみたものの、うまくいかず…

[code]

    ResourceBundle bundle = ResourceBundle.getBundle("application");
    String test = null;
    test = bundle.getString("test");
    test = new String( test.getBytes( "ISO-8859-1" ) , "JISAutoDetect" );
    
[/code]

またEclipseの設定は  
ウインドウ->一般->コンテンツタイプで  
javaプロパティファイルのデフォルトエンコードをUTF-8にしています。


CC BY-SA 3.0
2016-07-21T05:00:56.507
27787
2019-04-25T11:27:43.127
12842
question
eclipse
Eclipseでapplication.propertiesの値を取得すると文字化けする


  * [blog.k11i.biz: Java のプロパティファイルは UTF-8 エンコーディングで記述したい](http://blog.k11i.biz/2014/09/java-utf-8.html)

上記サイトで説明されている通りで実現可能かと思います。

[code]

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Locale;
    import java.util.PropertyResourceBundle;
    import java.util.ResourceBundle;
    
    public class ResourceBundleUtf8Control extends ResourceBundle.Control {
    
        @Override
        public ResourceBundle newBundle(final String baseName, final Locale locale, final String format,
            final ClassLoader loader, final boolean reload)
            throws IllegalAccessException, InstantiationException, IOException {
            final String bundleName = toBundleName(baseName, locale);
            final String resourceName = toResourceName(bundleName, "properties");
    
            try (InputStream is = loader.getResourceAsStream(resourceName);
                InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                BufferedReader reader = new BufferedReader(isr)) {
                return new PropertyResourceBundle(reader);
            }
        }
    }
    
[/code]

上のようなクラスを定義し、使用箇所では次のように記述します。

[code]

    ResourceBundle bundle = ResourceBundle.getBundle("application", new ResourceBundleUtf8Control());
    
[/code]

なお、
[Java9からはResourceBundleのデフォルトエンコーディングがUTF-8になった](https://www.oracle.com/technetwork/java/javase/9-new-
features-3745613.html#JDK-8027607)
ので上記のような手法は不要です。質問文に記載されたコードそのままで想定どおり取得できるようになっています。

[code]

    ResourceBundle bundle = ResourceBundle.getBundle("application");
    System.out.println(bundle.getString("test"));
    
[/code]

* * *

ただ、ファイル名を `application.properties` としているのが気にかかりました。それは本当にリソースバンドルでしょうか。

例えばそれが[Spring Bootの設定ファイル](https://docs.spring.io/spring-
boot/docs/current/reference/html/common-application-
properties.html)なのであれば、リソースバンドルでなく単なるプロパティファイルなので、 **Java9以降であっても UTF-8
に変換するのでなく ISO 8859-1 で扱うべきです。**

[Properties#load(InputStream)](https://docs.oracle.com/javase/jp/12/docs/api/java.base/java/util/Properties.html#load\(java.io.InputStream\)):

> 入力ストリームはload(Reader)で規定される単純行指向フォーマットで、ISO
> 8859-1文字エンコーディングを使用することが前提されます。つまり、各バイトは1つのLatin1文字です。
> Latin1にない文字、および一部の特殊文字は、キーや要素内で『Java™言語仕様』のセクション3.3で定義されているUnicodeエスケープを使用して表現されます。

事実、Spring Bootでは `application.properties` をそのように扱います:

  * [Read application.properties using ISO 8859-1 #10565](https://github.com/spring-projects/spring-boot/pull/10565)

* * *

ISO 8859-1エンコーディングされたプロパティファイルを Eclipse
上で想定通り(日本語も読めるように)表示させたい場合、次のようなプラグインが使えるかと思います:

  * [Properties Editor](https://marketplace.eclipse.org/content/properties-editor)


CC BY-SA 4.0
2016-07-21T06:47:51.720
27788
2019-04-25T11:27:43.127
2019-04-25T11:27:43.127
2808
2808
27787
answer