人からもらったArduinoスケッチをビルドしようとしたら、何か見覚えあるエラーが出たんですが、中々解決せず。原因は予想していたのとは違う、意外なところにありました。
エラー内容
ある日、人からもらったArduinoのスケッチをコンパイルしようとしたところ、次のようなエラーが出ました。
hogehoge:1:1: error: stray '\357' in program /** ^ hogehoge:1:1: error: stray '\273' in program hogehoge:1:1: error: stray '\277' in program
hogehogeはファイル名で、その1行目(/**)に、何やら入っていてはいけないモノが入っているというエラーです。
ははーーん、なるほど。全角スペースに違いない。
以前にもこんな感じのエラーに見た覚えがあったので全力で探したのですが、全角スペースは1行目はおろかファイルのどこにも見当たりませんでした。
なんだこれ、と思いつつグーグル先生にお伺いを立てることしばらく、以下のサイトにたどり着いて答えが分かりました。
原因は文字コード
Arduinoスケッチは通常UTF-8ですが、もらったファイルはなんとUTF-8Nでした!
……UTF-8Nって何?
初めて聞いたんですが、ファイルの先頭にBOM(バイトオーダーマーク)と呼ばれるものが含まれているものをUTF-8、含まれていないものをUTF-8Nと呼ぶそうです。
BOMは、そのファイルがUnicodeで記載されていることを明確化するためのもので、例えばUTF-8であれば「0xEF 0xBB 0xBF」を付けるそうです。
参考:wikipedia
エラーを吐いたスケッチにはこのBOMが無かったので、1行目の頭でコンパイルエラーになっていたという訳ですね。
文字コードを修正すればOK
原因が文字コードと分かってしまえばあとは簡単な話で、UTF-8にしてやればそれでOKです。
せっかくなので変換の方法を2つほどご紹介します。
Arduino IDEで変換
なんとArduino IDEに文字コードを変換する機能があったとは。
やり方は非常に簡単で、変換したいファイルを開いた状態で「ツール」>「エンコーディングを修正」を選ぶだけです。
VSCodeで変換
VSCodeはご存知ですか?(笑顔)
というのはさておき、Arduino IDEより数百倍便利な開発環境VSCodeでも、簡単に変換することが可能です。
画面下部のバーにあるUTF-8 with BOMと書かれていますが、これがUTF-8Nです。BOMが無いはずなのにwith BOMっておかしくね? とも思うんですが、多分気にしたら負けです。
この部分をクリックすると、「エンコード付きで再度開く」か「エンコード付きで保存」を選べ、好きな文字コードを選択できます。
この場合はUTF-8一択。
ロボカップジュニアの選手達を見ているとArduino IDEを脱出していない人が結構いるんですが、さっさと脱出した方がいいですよ。こっちには人権があります。
ではでは。
コメント