ワイド文字列の文字数を決定する同じコードを実行しました。テストされた文字列には、ASCII、数字、および韓国語が含まれています。
#include <iostream>
using namespace std;
template <class T,class trait>
void DumpCharacters(T& a)
{
size_t length = a.size();
for(size_t i=0;i<length;i++)
{
trait n = a[i];
cout<<i<<" => "<<n<<endl;
}
cout<<endl;
}
int main(int argc, char* argv[])
{
wstring u = L"123abc가1나1다";
wcout<<u<<endl;
DumpCharacters<wstring,wchar_t>(u);
string s = "123abc가1나1다";
cout<<s<<endl;
DumpCharacters<string,char>(s);
return 0;
}
明らかなことは、Visual C++ 2010 の wstring.size() は、ASCII 文字か国際文字かに関係なく、文字数 (11 文字) を返すことです。ただし、Mac OS X の XCode 4.2 では文字列データのバイト数 (17 バイト) を返します。
xcodeのバイト数ではなく、ワイド文字列の文字長を取得する方法を教えてください。
--- 2月12日追記 --
wcslen() も xcode で 17 を返すことがわかりました。vc++ では 11 を返します。テストしたコードは次のとおりです。
const wchar_t *p = L"123abc가1나1다";
size_t plen = wcslen(p);
--- 2月18日追記 --
llvm 3.0 が間違った長さの原因であることがわかりました。この問題は、コンパイラ フロントエンドを llvm3.0 から 4.2 に変更すると修正されます。
wcslen() は Xcode と VC++ では動作が異なり、詳細は VC++ に記載されています。