Win32APIのLCMapStringはある文字列をロケール依存な別の文字列にマッピング(変換)してくれる関数。(全角ひらがな→半角カタカナとか)
MSDNページのlpDestStr(変換された文字列を格納するバッファ)の解説には
cchSrc パラメータに渡す値にかかわらず、並び替えキーの最後には NULL が付けられます。
と書いてありますがどうもcchSrcに-1以外を指定すると、終端文字が付加されない模様。
std::wstring wstrSrc(L"きょうはいいてんきです");
std::unique_ptr<WCHAR[]> wzDest(new WCHAR[64]);
int iRet =
LCMapString(0x0411, LCMAP_KATAKANA, wstrSrc.c_str(), -1, wzDest.get(), 64);
はキョウハイイテンキデス
をちゃんと終端して返してくれますが、
std::wstring wstrSrc(L"きょうはいいてんきです");
std::unique_ptr<WCHAR[]> wzDest(new WCHAR[64]);
int iRet =
LCMapString(0x0411, LCMAP_KATAKANA, wstrSrc.c_str(), wstrSrc.length(), wzDest.get(), 64);
はwzDest
が終端されていません。戻り値を見て終端しましょう。
wzDest[iRet] = L'\0';