「error: stray 357 273 277」 は文字コード起因のエラー

テック

人からもらった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行目はおろかファイルのどこにも見当たりませんでした。

 

なんだこれ、と思いつつグーグル先生にお伺いを立てることしばらく、以下のサイトにたどり着いて答えが分かりました。

UTF-8とUTF-8N - うあぁな日記
今日は天気も悪く、特に出かける用事もなかったので、部屋に引きこもり(笑)。せっかくなので、かねてから思っていたツール作成...

 

スポンサーリンク

原因は文字コード

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を脱出していない人が結構いるんですが、さっさと脱出した方がいいですよ。こっちには人権があります。

ではでは。

テック
スポンサーリンク
スポンサーリンク
もりをフォローする
スポンサーリンク
みゆともり

コメント