ソースの文字コード

ソースの文字コードに痛く悩まされたので覚え書き。
2バイト文字が含まれているソースコードを各コンパイラで試してみました。
とりあえず、コンパイルオプションとかなしの状態で。

コンパイラ

☆ソース

#include <iostream>

int
main(){
    std::cout << "へろーわーるど" << std::endl;
    return 0;
}

コンパイル結果

[utf-8]

BOM あり なし
msvc
gcc
clang ×


[utf-16]

BOM あり なし
msvc
gcc × ×
clang × ×


[sjis]

msvc
gcc
clang

BOM:Byte Order Mark
○:コンパイル、実行も問題ない
△:実行時に文字化け
×:コンパイルエラー

☆回避方法

  • msvc
  • gcc
    • utf-8 + BOM なしの場合で、-fexec-charset=CP932 オプションで文字化け回避
  • clang

☆まとめ

ざっくりと試してみただけなのでもしかしたら間違いがあるかも知れません。
ロケールの設定とかは特に設定していないので、出力時の文字化けはそれが原因??
あと msvc で BOM がない utf-8 を扱うと警告が出てくるので注意しましょう。
それが原因でわけの分からないコンパイルエラーが出たり出なかったり。


もう頭がスタックオーバーフローしそうなので utf-8 で統一して、日本語出力は置いておこう。
どうせ、実験用コードぐらいにしか使用しないしね>日本語
とりあえず、gcc には -fexec-charset=CP932 でなんとか……。
まぁまたあとで問題が出てきそうだけど……。
あと github が、utf-8 以外だと文字化けするっていうのもでかいです。
他の C++er な方々はどの文字コードを使っているんだろうか。


[参照]
http://nakamura.goga.co.jp/article/124270631.html
http://d.hatena.ne.jp/ka-nacht/20080220/1203433500
http://msdn.microsoft.com/ja-jp/library/xwy0e8f2.aspx
http://www-online.kek.jp/~keibun/pukiwiki/index.php?MinGW%A4%CB%A4%C4%A4%A4%A4%C6