Exemple #1
0
/* -----------------------------------------------------------------------
 *  関数名  :  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);
	}