JDKのbinフォルダに入っているツールをまとめてみた　〜 国際化

### シリーズ一覧
第１回：[JDKのbinフォルダに入っているツールをまとめてみた](http://qiita.com/chooyan_eng/items/d0e99ba49affce0cbb93)
第２回：[JDKのbinフォルダに入っているツールをまとめてみた　〜 セキュリティ](http://qiita.com/chooyan_eng/items/e11761b6822ee9a2589a)
第３回：JDKのbinフォルダに入っているツールをまとめてみた　〜 国際化

***

JDKのbinフォルダに入っているツールを調べて見るシリーズ、第３回は「国際化」です。
この項目に分類されているツールは native2ascii のみですので、今回はそれについて説明します。

のですが、ちょっと調べていて、この記事に書いた内容が本当に native2ascii の本来の使い方なのか自分でもよく分かっていないです。。。ということで、この記事は参考程度に読んでいただければと思います。

# 国際化
## native2ascii
native2ascii は、コーディングしたJavaのソースファイル（厳密にはテキストファイルなら何でも）を、ASCII文字セットに含まれる文字のみに変換するツールです。ASCII文字セットに含まれない文字列については、Unicodeエスケープ(\uxxxx)表記が使用されます。

これにより、普段自分が開発している環境の文字コード設定と違う文字コードで書かれたソースコードを読み込んだときに、文字化けしてうまくファイルが開けない、という状況を回避します。

簡単なHelloWorldプログラムを例に考えてみます。

まずはUTF-8で HelloWorld.java を作成します。

```
$ nkf -g HelloWorld.java
UTF-8 (LF)

$ cat HelloWorld.java
package jp.co.chooyan;

public class HelloWorld {
  public static void main(String args[]) {
    System.out.println("こんにちは！ and HelloWorld!!");
  }
}
```

これを、文字コードが euc-jp の環境でそのまま開いてみようとします。

```
$ vi HelloWorld.java
```

```java:HelloWorld.java
package jp.co.chooyan;

public class HelloWorld {
  public static void main(String args[]) {
    System.out.println("・・＜・・ and HelloWorld!!");
  }
}
```

見事に化けていますね。。。
文字化けした結果、文法上意味のある文字に変換されてしまう可能性もあったりするので、このまま編集するのはとても不安です。

このような時に、 native2ascii で文字コードに依存する文字を取り除くのが有効になります。

```
$ native2ascii HelloWorld.java HelloWorld.java

$ nkf -g HelloWorld.java
ASCII

$ cat HelloWorld.java
package jp.co.chooyan;

public class HelloWorld {
  public static void main(String args[]) {
    System.out.println("\u3053\u3093\u306b\u3061\u306f\uff01 and HelloWorld!!");
  }
}
```

このように、「こんにちは！」にあたる部分は "\u3053\u3093\u306b\u3061\u306f\uff01" のように変換されました。文字コードもASCIIに変わっています。

これを、再度 euc-jp の環境で開いてみます。

```
$ vi HelloWorld.java
```

```java:HelloWorld.java
package jp.co.chooyan;

public class HelloWorld {
  public static void main(String args[]) {
    System.out.println("\u3053\u3093\u306b\u3061\u306f\uff01 and HelloWorld!!");
  }
}
```

今度はちゃんと開けました。"\u3053\u3093\u306b\u3061\u306f\uff01" 部分もそのまま表示されています。

この状態で「こんにちは」の文言を変更するのは難しいですが、それ以外のロジック部分のコーディングであれば、このまま進めてしまって問題なさそうです。

コーディングが終わったら、正確な文字コードの設定を知っている環境に変更をマージし、コンパイル、実行と進めれば問題なく実行できる、ということになります。（Unicodeエスケープされている状態のままコンパイル・実行すれば、元の「こんにちは」がちゃんと出力されます）

また、変換された部分の内容が知りたければ、以下のコマンドで確認可能です。

```
$ native2ascii -reverse HelloWorld.java -encoding euc-jp                                                                 
package jp.co.chooyan;

public class HelloWorld {
  public static void main(String args[]) {
    System.out.println("こんにちは！ and HelloWorld!!");
  }
}
```

### 参考
* https://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/native2ascii.html#BGBDFBIB

# まとめ

というわけで、 native2ascii についてまとめてみました。
とは言え、今回紹介した使い方では結局「こんにちは」部分の修正ができなかったり、実際試していて結局文字コードが違う環境でコンパイルして実行する方法がよくわからなかったり（何やっても文字化けする。。。）、ちょっとちゃんとした使い方がまだよく分かっていない状況です。

上記参考サイトには「ローカライズ可能なアプリケーションを作成します」と書いてあるので、実行も含めて正常に「こんにちは」が表示できるような仕組みである気がするのですが。。。

おそらく、文字コード関連の問題はソースファイルだけでなく、OS、ターミナル、Java実行時の設定等、様々な設定が絡み合っている部分であり、そのあたりがうまくいかなかった原因のような気はしているのですが、細かく検証している時間がないためこのまま記事を上げさせていただきます。新たな発見があれば記事を編集する予定です。

ツッコミや、こんな時こんな感じで使うよ、等ありましたら是非コメントいただければ幸いです。