Visual Studio 2010 の std::wstring::length が正しい値を返さなかった

激しくはまってしまったので覚書。
さて、std::wstring::length は本来であれば文字列の文字数を返します。

std::wstring(L"mado").length(); // => 4
std::wstring(L"ほむ").length(); // => 2


gcc と clang は問題なく文字数を返して来ました。
しかし、なぜか Visual Studio 2010 では文字数ではなくバイト数が返ってきました。

std::wstring(L"mado").length(); // => 4
std::wstring(L"ほむ").length(); // => 4

[原因]

これはソースファイルの文字コードutf-8 になっていた為です。
Visual Studio 2010 では BOM なしの utf-8 ファイルには対応していません。

[解決]

これを回避する場合はソースファイルの文字コードsjisutf-16 にする、もしくは BOM 付きのファイルにする必要があります。
文字コード周りに関しては前にも調べていたんだけどすっかりはまってしまいましたわ。


そういえば、Visual Studio 2012 だとここら辺の問題はどうなったのかな。