連絡先 Hikwareホーム
Hikware.Tech
自分用の覚え書きをそのまま公開。参考程度にどうぞ。

Visual Studio で UTF-8 で C++ を書いたら心が折れそうになった件

公開日 2017/10/20
最終更新 2017/10/20
  • Visual Studio で C++ のソースを UTF-8 で書くと執拗な嫌がらせを受けるが、他の開発環境とクロスで開発する以上、UTF-8 で書きたい。

Visual Studio 2017 になってなお

 C# は普通に UTF-8 でソースを書けてたんで油断してたけど、2017 年にもなってなお、C++ のソースは UTF-16 か、標準のマルチバイトコード(日本ならS-JIS)のどちらかで書く前提 になっていて、UTF-8 でコメント書いただけでも、

S-JISにそんな文字コード無ぇ!

的なワーニングが出る。超うぜえ!何これ超うぜえ!。最新の開発環境でこんな仕打ちを受けるとは思ってもいなかった。

 さらに腹立つのが、Visual Studio はプロジェクトを新規作成すると、わざわざ日本語のコメント付きのテンプレートソースを出力してくれるんだけど、それがなんでか UTF-8。なので当然、初回ビルドからワーニング出まくるし、サンプルで表示される文字が化けてる。バカなんじゃないかと。もう彼ら的に Win32 / C++ のテンプレートとかどうでもいいんだろうな。

なんとかしたい

 で、今作ってるアプリはクロスプラットフォーム前提だし、UTF-8 は堅持したいので何とかしたいのだけれど、解決策は2択。

  1. UTF-8 のソースには必ず BOM つければコンパイラも分かってくれる
  2. コンパイラオプションで文字コードを強制

 1 はまあ分かるんだけど、すでに BOM なしのソースが大量にあるし、全ての開発環境やエディタで必ず保存時に BOM つけるように徹底するの正直めんどい。

 そして本命の 2。C/C++ コンパイラのオプションに、/source-charset:utf-8 を追加すれば、BOM なしの場合は UTF-8 と思ってコンパイルしてくれる。プロパティページに該当する設定項目はなさげなので、コマンドラインの追加オプションに書き込めばOK。

これで安心と思いきや、さらに頑固な奴が

 これで一旦はワーニング出なくなって平和になったんだけど、リソースをいじったらまたワーニング出始めた。リソースを編集すると resource.h が再生成されるんだけど、その中にわざわざ日本語のコメントを書きやがる。S-JIS で!

 んで今は全ソース UTF-8 だと思ってコンパイルしてるんで、今度は

UTF-8にそんな文字コード無ぇ!

とか言い出す訳だ。ちなみにプロジェクト新規作成時には resource.h は BOM なしの UTF-8 だったんだけどね。再生成されると S-JIS になる。ホント頭にくる。

 さて、ヘッダだからこれだけコンパイル設定変えるのも無理だし、どうしたもんかといろいろ試してたら、resource.h を一度 BOM 付きの UTF-8 に変換してしまえば、以後再構築される際も UTF-8 で作られる 模様。読み込む時のエンコーディング維持してるのね。

 なお、文字コードや BOM の有無は Visual Studio でも変更できるけど、2017 から手順が変わったらしいので注意。

これで安心と思いきや、さらに我儘な奴が

 じゃあ同じ原理で、リソースの .rc ファイルも BOM つけたら UTF-8 にできるんじゃね?、と思ってやってみたら、今度はロードエラーという。まるで一貫性がない。

 .rc ファイルについては、BOM 付きでも UTF-8 は非対応らしく、UTF-16 なら正常に読み込んでくれる 模様。

 というか UTF-16 にしないとローカライズもままならないし、なぜ頑なにマルチバイトコードをデフォルトにするのか理解に苦しむ。おまけに新規生成時は BOM なしの UTF-8 だから文字化けするし。

まとめ

  • Visual Studio で BOM なしの UTF-8 で C++ の開発をしたい場合は、コンパイラオプションに /source-charset:utf-8 をつける。

  • resource.h はデフォルトだと標準のマルチバイトコード(日本ならS-JIS)で作られるが、一度 BOM 付き UTF-8 に変換 すれば、以後 UTF-8 で作られる

  • リソースの .rc は UTF-16 か標準のマルチバイトコード(日本ならS-JIS)しか受け付けないので、さっさと UTF-16 にしてしまう