rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【JAVA】native2asciiのpropertiesファイルを復元

全角文字を含む値(VALUE)を持つjavaのpropertiesファイルは、使用する環境を考慮してか得てしてnative2ascii化されていることが多い。
よって、メモ帳やらサクラエディタ等の、一般的なテキストエディタで開くとこんな感じに見えてしまう↓
test.key=\u30d5\u30a1\u30a4\u30eb\u306e\u51fa\u529b\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
#ちなみに"ファイルの出力に失敗しました"と書いてある
当然この状態だと何書いてあるかわからんので日本語にしたいのだが、
知っているかぎりエディタ上でこれを日本語で復元して読み込んでくれるのはEclipseしかなく、
いちいちこのpropertiesファイルのために重いEclipse立ち上げるのも億劫で
手軽なnative2asciiの復元方法や、エディタがあればいいなあと思っていた。
どうもコマンドプロンプト上でnative2asciiコマンドを使うのが最も手っ取り早そうなので、
ここでその使い方を記述する。



native2asciiを個別に入れた覚えはないので多分java標準でついてくるんだと思う。
私の環境では%JAVA_HOME%\bin配下に存在していた。
native2ascii化されたpropertiesファイルを日本語に復元するコマンドは以下。
native2ascii -reverse [元ファイル名] [復元後ファイル名]

例えばnative2ascii化された設定ファイル「Test.properties」を日本語復元版設定ファイル「Test.properties.rev」に復元する場合は
native2ascii -reverse Test.properties Test.properties.rev
とする。


ちなみに逆に(というか日本語復元が本来の使い方からすると「逆」なんだが)
native2ascii化する場合は引数なしで
native2ascii [元ファイル名] [変換後ファイル名]
とする。

native2asciiは全角文字をシステム的に扱える形の半角にする処理(だと簡単に解釈している)なので、
元が半角文字だけだと変換後と元ファイルは同一になる。

また、全角文字が入っている場合、元のファイルのエンコードが何だったかによって、
同じ文字列でも変換後の内容が異なる場合がある。
例えば以下のようなpropertiesを変換する場合
test.key=テストです。
元ファイルがSJISエンコードされている場合「\u30c6\u30b9\u30c8\u3067\u3059\u3002」
元ファイルがUTF8でエンコードされている場合「\u7e5d\ufffd\u7e67\uff79\u7e5d\u533b\u3012\u7e3a\u5436\ufffd\ufffd」
になる。
ただしこれはWindowsマシン上(=デフォルトエンコードSJIS)の動きであり、
UNIXマシン上(=デフォルトでンコードがUTF8)だと結果は逆になる。
(試してないけど)
Windowsマシン上でエンコードを指定せず(つまりSJISで)UTF8のファイルを開こうとするといわゆる「文字化け」が起きるが、
上記のUTF8の結果はそれに相当する。
要するに文字化けており、本来読み込みたかった"テストです。"という文字列を表していない。
ちなみにこんなん↓になる。
utf8_mojibake_example.png

native2asciiにも、javacと同じような「-encoding」のオプションがあるようだ。
Windowsマシン上でUTF8のファイルを相手にnative2asciiする場合、
あるいはUNIXマシン上でSJISのファイルを相手にnative2asciiする場合は、
「-encoding」オプションでエンコードを指定してやる必要があるということである。