NT4.0+VC6.0環境で
文字コードをS-JISをUTF-8にする方法を知りませんか?
WIN32APIの
MultiByteToWideCharをつかってみましたがうまくいきません。
例などはないですか?
その他の方法でもいいですが,ロジックでカバーしたいです。
反応がないので自己レスします。
(1) Win32ではS-JIS->UTF2->UTF8でカバーできると思います。
ただし,APIのバグはあるようです。
ucs2len = MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
s,
strlen(s),
ucs2,
sizeof(ucs2)/sizeof(*ucs2));
utf8len = WideCharToMultiByte(CP_UTF8,
0,
ucs2,
ucs2len,
utf8,
sizeof(utf8),
NULL,
NULL);
(2) 変換テーブルをもつ方法
unix等に対応するのであれば規格にそって変換テーブルをもつ。
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
#詳しくは samba-2.0.7 JP2.1 の source/lib の、
#kanji.c,util-unistr.c にあります。
VC++ならこんな感じですね。
CString SJIStoUTF8(LPCSTR lpszSJis){
USES_CONVERSION;
LPWSTR pText = A2W(lpszSJis);
CString result;
while(*pText != L'\0'){
if(0<=*pText && *pText<=0x7f){
result += (char)*pText;
}else if(0x80<=*pText && *pText<=0x7ff){
result += (unsigned char)((*pText >> 6) & 0x1f)|0xc0;
result += (unsigned char)(*pText & 0x3f)|0x80;
}else if(0x800<=*pText && *pText<=0xffff){
result += (unsigned char)((*pText >> 12) & 0x0f)|0xe0;
result += (unsigned char)((*pText >> 6) & 0x3f)|0x80;
result += (unsigned char)(*pText & 0x3f)|0x80;
}
pText++;
}
return result;
}
以上。