例) wchar_t sText = L"いろはに"; char sDest [256];
DWORD dwLen = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)sText, -1, NULL, 0, NULL, NULL );
WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)sText, -1, sDest, dwLen, NULL, NULL);
sDest[dwLen] = '\0';
wcstombs() は、内部で WideCharToMultiByte?() を呼び出している。
ex.) int mbs_len = wcstombs( NULL, msg, 0 ); char * mbs = new char [mbs_len + 1]; try { wcstombs( mbs, msg, mbs_len + 1 ); } catch (...) { } delete mbs;
mbtowc() は、内部で MultiByteToWideChar?() を呼び出している。
とりあえず、Wikipedia の説明 。
ちなみに、UTF-16 と UTF-32 には、先頭 2byte に BOM(Byte Order Mark) というモノがついてくることがある。ここには、その文字コードが LE(little endian/FFFE) なのか BE(big endian/FEFF) なのかを区別するための情報が書き込まれる。
ところで、本来 BOM が必要ない(LE/BE の区別がない)はずの UTF-8 にも BOM がつくことがある。私は、その文字コードが UTF-8 であるかどうかを識別するためだけに使うものと解釈してるんだけど、ちとよく解ってない。
wchar_t という型は「ワイド文字」と呼ばれるが、これは環境によって実装がことなる模様。
VC++ (Win32 環境?)
wchar_t は 2byte, サロゲートペア部分を取り除いたBOMなしの UTF-16(BE)
UTF-16 には BE(big endian) と LE(little endian) の2種類があるが、 Windows 環境 (LE) の ワイド文字がなぜ UTF-16BEなのかは謎。
gcc (大抵の unix 環境)
wchar_t は 4byte, 文字コードは UCS4。
VC++ では、コンパイラの設定によって、 デフォルトでマルチバイト文字セットを使うか、 Unicode を使うか、という設定がある。 VC++.NET 2003 なら、プロジェクトのプロパティの[構成プロパティ]の[全般]の[文字セット] 。
_T というマクロは、文字列を環境デフォルトに変換するマクロ。
_T("あいうえお");
マルチバイトをデフォルトにしているが、ワイド文字列として扱いたい場合は、
L"あいうえお"
とする。
文字列を、バイト配列や vector で扱うときは、 null(0) 終端すると確実。
(std::string はどうなんだろう)
char str [16]; ... str [15] = '\0';
std::vector<char> str; ... str.push_back( 0 );
C/C++ の文字列のお約束。