メモの日々


2023年06月19日(月) [長年日記]

[c++][windows] Visual C++でソースコードのエンコーディングをUTF-8にするときの注意

UTF-8を使って書かれたソースコードをVC++でコンパイルすることは、正しい設定をしていれば問題ない。ただ、正しく設定されていないと分かりにくい問題が起こることがあるのでメモ。

問題のある挙動

UTF-8で保存した次のコードはVC++でコンパイルできる。

#include <iostream>

int main()
{
    int a = 0;

    // ああ
    a = 100;

    // あ
    a = 200;

    std::cout << "a=" << a << std::endl;
}

しかし、条件が揃っていると、実行したときに

a=100

と出力される。

不思議だし、エラーになるわけではないのでこのような問題が起きていることに気づかないケースもあるだろう。

問題が起こる条件

上記のようになるのは、次の条件が揃っているときだ。

  • ソースコードの文字エンコーディングがUTF-8
  • ソースコードにBOMが無い
  • ソースコードの改行コードがLF
  • コンパイルオプションで文字エンコーディングを指定していない

自分が遭遇したのは、問題なかったコードに対してビルドできないという報告が上がってきたこと。原因は、それまではgitの設定が core.autocrlf=true な環境で使っていたのを core.autocrlf=false な環境でビルドしたため、改行コードがLFに変わったことだった。

対策

上述の条件のどれかを変えればいいのだけれど、通常は、コンパイルオプションで文字エンコーディングを指定するのがいいだろう。

具体的には、/utf-8を指定するようにすればよい。