人生初めてのプログラミングだからこそ、手軽な「メモ帳」を使うな！余計な災いを呼ぶよ！

#コードの内容以前に、何を書いても「不正な文字です」⇒挫折の恐れも#

これからプログラミングの勉強を始めようという方、きっと素晴らしい決意とやる気に満ちていると思います。
「まずプログラミングってどうやればいいの？」といろいろ検索していると、「**パソコン（Windows）に搭載されてるメモ帳機能でお手軽にプログラミングができるよ！**」という初心者向けの記事を目にすることがきっとあるでしょう。

**でもちょっと待って！**

いまから、私が人生初めて「**Java**」という言語でプログラミングをした際に、**「メモ帳を使ったせいで」エラーに悩まされて困った**体験をお話しします。


※ひとことで言えば、「メモ帳のBOMのせいで、UTF-8でコードを書くとコンパイルエラーになり、たとえコード自体が正しく書けていても『不正な文字です』と言われるのでやる気がどんどんそがれる」という話です。「その話なら知ってる」という方はこの先読まなくても大丈夫です。逆に「ん？何？」という方はぜひこの先をお読みください。

#メモ帳を使わずに成功する例#

プログラミング言語の初日にやることとして定番なのが
「**その言語を使って、パソコンに"Hello World!"という文字を出力する**」ことです。

プログラミングをするには、パソコンにどんな動作をさせるかを文章に書き、それをパソコンに読み込ませます。この文章のことを「**コード**」といい、コードは「**エディタ**」という、文章を自由に書けるアプリを使って書いていきます。文章が書けるアプリといっても、「Microsoft Word」や「Excel」なんかはダメで、コードを書ける機能が搭載されたものに限ります。それが「メモ帳」だったり、私がいま使っている「Terapad」だったりします。他にもいろいろあります。

[Terapad公式ダウンロードサイト（無料です）](https://tera-net.com/library/tpad.html)

エディタに↓こんな風に↓コードを書いて、「**Hello.java**」というファイル名で保存。
（当然勉強１日目ですから、コードは教科書のコピペで良いのです。ほとんどの教科書に"Hello World!"の書き方が載っています）

```Hello.java
public class Hello{
   public static void main(String[] args){
     System.out.println("Hello World!!");
   }
}
```
↓エディタはこんな感じのアプリです。（これはTerapad）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/6ba4f9c2-1788-c879-4b13-da5d3bbb70b6.png)


コマンドプロンプトに「**javac Hello.java**」と入力
 → エラーが出なければコンパイル(読み込み)成功なので「**java Hello.java**」と入力
 → 「Hello World!」が出力される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/e48ffb0e-d0b6-1c6e-45d9-d23ac46517a0.png)
このようにして「Hello World!!」の出力に成功し、プログラミング学習の一歩を踏み出せます。誰もが安心してこの初めてのプログラミングを成功できるべきです。

**しかし、メモ帳を使うとこれが途端にうまくいかなくなります。**

#メモ帳を使ったせいで失敗した例#
なぜメモ帳を使うとうまくいかないのか。
メモ帳を使って"Hello World!!"の出力をやってみましょう。

メモ帳に先ほどのコードを書き、「**Hello.java**」というファイル名で保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/3f6eeb1a-1dc8-e347-cc4e-5fc68db706e0.png)
**保存するときに「文字コード」をどれにするか選択を迫られます。**
**プログラミングのコードは普通「UTF-8」という文字コードで保存します（世界標準の規格であり、違う国の人と共同開発するような場合に適しているからです）。**
**なのでここでも「UTF-8」を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/0db15b99-cff9-af65-80ed-77bd194f1018.png)


コマンドプロンプトに「**javac -encoding UTF-8 Hello.java**」と入力。
私が使っているWindowsのコマンドプロンプトは「Shift_JIS」という文字コードがデフォルトなので、**違う文字コードを使うときには宣言する必要があります**。

すると・・・？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/43a14055-f782-8908-8d4c-ac4fc2bbc9a2.png)

**「エラー: '\ufeff'は不正な文字です」**
そう、ここでエラーになってしまうのです。
このエラーの理由は後述しますが、自分が書いたコードの内容とは全く関係ありません。
つまり、**どんなに正しくて素敵なコードを書いても、「不正な文字です」というエラーで読み込みを拒否されます**。

#メモ帳の「BOM」がエラーを引き起こす#

なぜエラーが起こってしまうのか。
それは、UTF-8という文字コードで保存したファイルの先頭には、**「ここがファイルの先頭だよ！」ということを知らせるための特殊なマーク（バイトオーダーマーク：略してBOM**）がついており、**コマンドプロンプトでコードと関係のないそのマークを読み込んでしまってエラーになる**からのようです。

メモ帳以外のエディタでは、UTF-8という文字コードでファイルを保存するときに、**BOMを付けるか付けないか決めることができます**。

たとえば私の使っているTerapadでは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/3859b8a5-f38b-ff0a-31f5-ab68613c5621.png)
「UTF-8（BOMあり）」か「UTF-8N(BOMなし)」かを選べるようになっています。

しかしメモ帳では「UTF-8」一択のみ。必ずBOMありで保存される仕組みになっています。
つまり、**基本的にUTF-8でファイルを保存することになるプログラミングとは非常に相性が悪い**のです。

#BOMのありなしを選べるエディタで、プログラミングを始めよう！#
初めてのプログラミングでは、「私が書いたコード、合ってるのかな…」と不安いっぱいなもの。そこに加えて文字コードがなんだとか「不正な文字です」とか言われてしまっては、せっかくのやる気がどんどんなくなってしまいます。
なので、**「プログラミングやってみるぞ！」と思ったらぜひ初めに、BOMのあり・なしを選べるエディタを探してみてください。**