そろそろソースコードも UTF-8 で統一したいと常々思っていました。
VisualC++ の場合 BOM (ef bb bf) があれば UTF-8 とみなしてくれます。
バイナリには記述したコードのまま格納されるわけではなく、
必要に応じて 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 はだめ。