/* ----------------------------------------------------------------------- * 関数名 : CUnicodeF::utf8_to_sjis * 機能概要: UTF-8 -> SJIS へ文字列のコード変換 * 引数 : (I) char *pUtf8Str - 変換元UTF-8文字列へのポインタ * (O) int *nBytesOut - 変換後文字列のバイト数 * 戻り値 : char* 変換後SJIS文字列へのポインタ * * 処理概要: * ----------------------------------------------------------------------- */ char *CUnicodeF::utf8_to_sjis(const char *pUtf8Str, int *nBytesOut) { int nNum, nBytes; wchar_t *pwcWork = utf8_to_utf16be( pUtf8Str, &nNum, TRUE); char *pcSjis = utf16be_to_sjis( pwcWork, &nBytes); free( pwcWork); *nBytesOut = nBytes; return pcSjis; }
void WinCodepageConverter::_unicodeToBuffer<1>(ByteBuffer& _destBuffer, ConstStringHolder<1> _srcString) { // An empty string needs special processing. if(_srcString.empty()) return; const uint8* data; size_t sz; ByteBuffer buf; switch(getCodepage()) { case CP_UTF8: { // UTF-8 -> UTF-8 data = _srcString.c_str(); sz = _srcString.size(); break; } case CP_UTF16LE: { // UTF-8 -> UTF-16LE utf8_to_utf16le(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } case CP_UTF16BE: { // UTF-8 -> UTF-16BE utf8_to_utf16be(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } case CP_UTF32LE: { // UTF-8 -> UTF-32LE utf8_to_utf32le(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } case CP_UTF32BE: { // UTF-8 -> UTF-32BE utf8_to_utf32be(buf, _srcString.c_str(), _srcString.size()); data = buf.data(); sz = buf.size(); break; } default: { // UTF-8 -> UTF-16 Utf16Buffer buf16; utf8_to_utf16(buf16, _srcString.c_str(), _srcString.size()); // UTF-16 -> destination code page size_t maxsz = (buf16.size() + 10) * 4; buf.resize(maxsz); BOOL usedDefaultChar; int r = WideCharToMultiByte(getCodepage(), 0, char_cast<LPWSTR>(buf16.data()), buf16.size(), char_cast<LPSTR>(buf.data()), buf.size(), 0, &usedDefaultChar); sz = r; data = buf.data(); if(r == 0 || usedDefaultChar) UnicodeSupport::_throwCouldNotConvert(getName(), "UTF-16", buf16.data(), buf16.size() * 2); } } appendDataToBuffer(_destBuffer, data, sz); }