VisualStudio と UTF-8

そろそろソースコードも UTF-8 で統一したいと常々思っていました。
VisualC++ の場合 BOM (ef bb bf) があれば UTF-8 とみなしてくれます。

コンパイラおよびリンカでの Unicode のサポート

バイナリには記述したコードのまま格納されるわけではなく、
必要に応じて ShiftJIS や UTF-16 に変換されます。

関連エントリ
_T() と TEXT() の違いやソースの文字コード

逆に UTF-8 のままデータを記述することが難しいのと、
BOM が付くと他のコンパイラでエラーになることがあるようです。

"表示" を utf-8 でコンパイルしてみる

  SJIS = 95 5c 8e a6
  UTF8 = e8 a1 a8 e7 a4 ba
  UTF16= 8868 793a

VC2008: utf8+bom  = 95 5c 8e a6  (SJISに変換されている)
VC2008: utf8      = e8 a1 a8 e7 a4 ba
CW    : utf8+bom  = error
CW    : utf8      = e8 a1 a8 e7 a4 ba
gcc4.1: utf8+bom  = error
gcc4.1: utf8      = e8 a1 a8 e7 a4 ba

VC bom 無しはたまたまうまくいってますが、Shift JIS 判定ありなので
問題が出ます。(warning C4819 になる事も)

例えば “引\n” を UTF-8 記述すると、バイト列では

 引       \  n
 e5 bc 95 5c 6e

ShiftJIS でも意味のあるコードなので、’\’ ‘n’ が変換されず
文字として残ります。

常に日本語 (cp932) とみなすこの動作は、Windows のシステムロケールを
見ているようです。VisualStudio は英語版を使っているし、option の
“International Settings” にある Language を
“Same as Microsoft Windows” でなく English にしても変化無し。

Vista で コントロールパネル→地域と言語のオプション→管理
「Unicode対応ではないプログラムの言語」を「英語」に切り替えると
コードが素通りし、”引\n” の \n が改行に変換されるようになりました。

でも他のアプリに影響が出るので、このまま使うのは問題ありです。

gcc では「 -finput-charset=cset 」「 -fexec-charset=cset 」の
オプションがあって、それぞれ個別に指定できるようです。
例えば utf8 と sjis にすると VC とほぼ同じ挙動となりました。
でも BOM はだめ。