最近、作業中のwebappのエンコーディングをISO-xx
からutf8
に切り替える必要がありました。プロパティファイルを除くすべてがスムーズに進みました。 -Dfile.encoding=UTF-8
にEclipse.ini
を追加しましたが、通常のファイルは正常に機能します。しかし、プロパティには奇妙な振る舞いがあります。
Notepad ++からutf8
エンコードされたプロパティをコピーし、Eclipseに貼り付けた場合、それらは表示され、正常に動作します。プロパティファイルを再度開くと、次のような適切な文字ではなく、いくつかのUnicode文字が表示されます。
Zur\u00EF\u00BF\u00BDck instead of Zurück
しかし、アプリはまだ正常に動作します。プロパティの編集を開始し、いくつかの特殊文字を追加して保存すると、それらは正しく表示されますが、それらは機能せず、以前は機能していた特殊文字はすべて機能しなくなります。
ローカルバージョンとCVSを比較すると、リモートファイルに特殊文字が正しく表示され、更新後に再び起動します。アプリは動作しますが、EclipseはUnicode文字を表示します。
ファイルエンコーディングを右クリックして[その他:UTF8]を選択してファイルエンコーディングを変更しようとしましたが、役に立ちませんでした。また、「内容から判断:ISO-8859-1」
Java 6とEclipse 3.3ベースのJboss Developerを使用しています
Notepad ++でプロパティを編集し、Eclipseに貼り付けることで対応できますが、Eclipseでこれを修正するのを手伝ってくれたらありがたいです。
時間を無駄にしないでください。 Resource Bundle plugin inEclipse
プロパティファイルは、定義によりISO-8859-1です。 Properties クラスのドキュメントを参照してください。
Springには、 PropertiesFactoryBean
を使用して、指定されたエンコーディングでロードできる置換があります。
編集:ローレンスがコメントで述べたように、Java 1.6はload
とstore
/Reader
とWriter
のオーバーロードを導入しました。 ] _。これは、任意のエンコーディングでファイルのリーダーを作成し、load
に渡すことができることを意味します。残念ながらFileReader
stillでは、コンストラクター(aargh)でエンコードを指定できないため、FileInputStream
とInputStreamReader
を一緒にチェーンする必要がありますが、機能します。
たとえば、UTF-8を使用してファイルを読み取るには:
Properties properties = new Properties();
InputStream inputStream = new FileInputStream("path/to/file");
try {
Reader reader = new InputStreamReader(inputStream, "UTF-8");
try {
properties.load(reader);
} finally {
reader.close();
}
} finally {
inputStream.close();
}
Eclipseの問題ではありません。 Propertiesクラスを使用してプロパティファイルを読み込んで保存している場合、クラスはすべての特殊文字をエスケープします。
プロパティをストリームに保存したり、ストリームから読み込んだりする場合、ISO 8859-1文字エンコードが使用されます。このエンコードで直接表現できない文字には、Unicodeエスケープが使用されます。ただし、エスケープシーケンスでは単一の「u」文字のみが許可されます。 native2asciiツールを使用して、プロパティファイルを他の文字エンコーディングとの間で変換できます。
\ u0020未満の文字と\ u007Eより大きい文字は、適切な16進値xxxxに対して\ uxxxxとして書き込まれます。
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
魔法のように働く
:-)
エラーが発生する可能性のあるプロセスのポイントが多すぎるため、何が間違っているのかを推測しようとはしませんが、内部で何が起こっているかは知っていると思います。
EF BF BD
は、U+FFFD
のUTF-8エンコード形式です。これは、デコーダが不正な入力を検出したときに挿入する標準の置換文字です。テキストはISO-8859-1として保存され、UTF-8として読み取られ、UTF-8として保存され、プラットフォームのデフォルトエンコーディングを使用してnative2ascii
を使用してプロパティ形式に変換されるようです例:windows-1252)。
ü=> 0xFC // ISO-8859-1 0xFC => U + FFFDとして保存// UTF-8 U + FFFD => 0xEF 0xBF 0xBDとして読み取り// UTF-として保存8 0xEF 0xBF 0xBD =>\u00EF\u00BF\u00BD // native2ascii
「file.encoding」プロパティはそのままにしておくことをお勧めします。 「file.separator」や「line.separator」のように、期待するほど有用ではありません。代わりに、テキストファイルを読み書きするときは常にエンコーディングを指定する習慣を身に付けてください。
もっと簡単な方法があります:
props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
これはJava 1.6。PropertiesクラスにはInputStreamReader
を解析するメソッドがないため、1.5でこれを行うにはどうすればよいですか。
* .propertiesファイル用のちょうど別のEclipseプラグイン:
UTF-8 .propertiesファイルを定義して翻訳を保存し、ResourceBundleを使用して値を取得できます。問題を回避するために、エンコードを変更できます。
String value = RESOURCE_BUNDLE.getString(key);
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
これは、ドイツ語、ポルトガル語、フランス語の特殊文字を含む一部の文字でのみ機能するようです。しかし、ロシア語、ヒンディー語、標準中国語の文字で問題が発生しました。これらはプロパティ形式「native2ascii」に変換されず、代わりに??で保存されます? ?
これらの文字を正しく表示できるようにする唯一の方法は、UTF-8形式に変換されたプロパティファイルにそれらを置くことです。-の代わりに\ u0915、またはяの代わりに\ u044Fです。何かアドバイス?
Attesoro( http://attesoro.org/ )を使用することをお勧めします。シンプルで使いやすいです。そして、Javaで作られています。