FreeMindで保存するファイルのエンコーディングをUTF-8にする

## 概要
FreeMindで作成したマップを保存すると、Unicodeが16進数化された形式になります。
これをUTF-8で保存できるようにしてみました。
(UTF-8で保存されたファイルは、なぜかそのままFreeMindで読み込めています。ので、今回は保存する処理だけUTF-8化します。)

UTF-8で保存するメリットは次のように考えています。

* Spotlightの検索対象になる
* grepできるようになる

## 今回試した環境

* OS: macOS High Sierra
* バージョン: 1.0.1
* JDK: 1.8.0_201

## 手順
### ソースをダウンロード
まず次の URL からソースファイルをダウンロードします。
https://sourceforge.net/projects/freemind/files/freemind/1.0.1/

次のファイルをダウンロードします。ダウンロードしたら解凍します。
freemind-src-1.0.1.tar.gz

修正するのは次の 2つのファイルです。

* freemind/freemind/main/XMLElement.java
* freemind/freemind/modes/mindmapmode/MindMapMapModel.java

### ダウンロードしたソースを修正
修正内容は、それぞれ次の通りです。

#### freemind/freemind/main/XMLElement.java

まず編集するのは次の16進数化している処理です。
(変更前)

```java
2456: default:
2457:    int unicode = (int) ch;
2458:    if ((unicode < 32) || (unicode > 126)) {
2459:        writer.write('&');
2460:        writer.write('#');
2461:        writer.write('x');
2462:        writer.write(Integer.toString(unicode, 16));
2463:        writer.write(';');
2464:    } else {
2465:        writer.write(ch);
2466:    }
```

これを次のようにコメントアウトします。
(変更後)

```java
2456: default:
2457:    int unicode = (int) ch;
2458:    //if ((unicode < 32) || (unicode > 126)) {
2459:    //    writer.write('&');
2460:    //    writer.write('#');
2461:    //    writer.write('x');
2462:    //    writer.write(Integer.toString(unicode, 16));
2463:    //    writer.write(';');
2464:    //} else {
2465:        writer.write(ch);
2466:    //}
```


#### freemind/freemind/modes/mindmapmode/MindMapMapModel.java

次にファイル出力しているところを編集します。
(変更前)

```java
285: BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(
286:        new FileOutputStream(file)));
```

これを次のように UTF-8 の指定を追加します。
(変更後)

```java
285: BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(
286:        new FileOutputStream(file), "UTF-8"));
```

### コンパイル

クラスパスに FreeMindアプリの JARファイルを指定して、編集したソースをコンパイルします。

```bash
cd ~/Downloads/freemind-src-1.0.1.tar.gz/freemind
javac -cp /Applications/FreeMind.app/Contents/Java/freemind.jar freemind/freemind/main/XMLElement.java freemind/freemind/modes/mindmapmode/MindMapMapModel.java
```

### JARファイルを更新

オリジナルのJARファイルを更新する前に、拡張子.orgでバックアップしておきます。

```bash
cp -p /Applications/FreeMind.app/Contents/Java/freemind.jar{,.org}
```

コンパイルしたクラスファイルをJARファイルに更新します。

```bash
jar uf /Application/xxx/freemind.jar freemind/freemind/main/XMLElement.class freemind/freemind/modes/mindmapmode/MindMapMapModel.class
```

### 確認

それでは FreeMind で作成したファイルが UTF-8 で保存されるようになったか確認します。
事前に FreeMind で保存したファイルは、次のようになっていました。

(変更前)

```xml
<map version="1.0.1">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node CREATED="1562581830801" ID="ID_1221806494" MODIFIED="1562581837270" TEXT="&#x307b;&#x3052;">
<node CREATED="1562581837272" ID="ID_187674930" MODIFIED="1562581839399" POSITION="right" TEXT="&#x3075;&#x304c;"/>
</node>
</map>
```

このファイルを FreeMind で開いて、保存し直すと次のようになりました。

(変更後)

```xml
<map version="1.0.1">
<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->
<node CREATED="1562581830801" ID="ID_1221806494" MODIFIED="1562581837270" TEXT="ほげ">
<node CREATED="1562581837272" ID="ID_187674930" MODIFIED="1562581839399" POSITION="right" TEXT="ふが"/>
</node>
</map>
```