そんなの簡単ジャン!
MultiByteToWideCharで、UTF-8からUTF16にして
WideCharToMultiByteで、UTF-16からSJISにすればいいだけじゃん。
終了。。
って言う人が多いかとは思うけど、
暗記力の悪いウィリアムのいたずら、
MultiByteToWideCharの引数ってなんだったっけ?
バッファの大きさもとめるのに、0いれるんだっけ(^^;)
と、なってしまうので、
自分へのメモということで、かいてみました。
こんなかんじ
unsigned char *MyUtil::utf8ToSjis(char *utf8) { wchar_t* utf16 = NULL; if ( utf8 == NULL ) return NULL; //==============================// // UTF8=>UTF16変換 // //==============================// // まずは、wlenの長さをとる const int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); if (!wlen) { return NULL; } // utf16の領域確保 utf16 = new wchar_t[wlen + 1]; if ( utf16 == NULL ) { return NULL; } // utf16変換 if ( MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, wlen) > 0 ) { utf16[wlen] = L'¥0'; } else { delete utf16; return NULL; } //==============================// // UTF16=>ShiftJIS変換 // //==============================// // まずは、長さを取得 const int mlen = WideCharToMultiByte(CP_ACP,0,utf16,-1,NULL,0," ",NULL); if (!mlen) { delete utf16; return NULL; } // 領域確保 unsigned char *sjis = new unsigned char[mlen + 1]; if ( sjis == NULL ) { delete utf16; return NULL; } // utf16変換 if ( WideCharToMultiByte(CP_ACP,0,utf16,-1,(LPSTR)sjis,mlen," ",NULL) > 0 ) { sjis[mlen] = 0; } else { delete utf16; delete sjis; return NULL; } // あとしまつ delete utf16; return sjis; } |
(上記< > ¥ は本当は半角です)
MyUtilクラスに、はいるってことにしてます。
引数がutf-8文字列、返り値がNULLだと問題あり、
それ以外の場合はSJIS変換文字列です。
変換文字列が帰ってきた場合、メモリの解放(free)は、呼び出し側でやってくださいね。
