struct __declspec(uuid("275C23E1-3747-11D0-9FEA-00AA003F8646")) IMultiLanguage;
enum
{
CODEPAGE_SHIFTJIS = 932,
CODEPAGE_EUCJP = 51932,
CODEPAGE_ISO2022JP = 50220
};
// コードページの取得
// 失敗したらすべて デフォルト値(CODEPAGE_SHIFTJIS)を返す
static DWORD GetCodePage(LPCTSTR szCharset, DWORD dwDefaultCP = CODEPAGE_SHIFTJIS)
{
HRESULT hr = S_OK;
if (lstrcmpi(szCharset, _T("pdc")) == 0)
{
// vodafone 端末では charset=pdc が使われることがある。
// これは正式な文字セットの名前ではないので下のコードでは失敗する。
// 細かい差異があるのかもしれないが、とりあえず iso-2022-jp として
// 扱っておけば大丈夫なようだ。
return CODEPAGE_ISO2022JP;
}
MIMECSETINFO info;
hr = GetCharsetInfo(_bstr_t(szCharset), &info);
if (FAILED(hr))
{
return dwDefaultCP;
}
return info.uiInternetEncoding;
}
static HRESULT GetCharsetInfo(BSTR Charset, PMIMECSETINFO pCharsetInfo)
{
HRESULT hr = S_OK;
try
{
IMultiLanguagePtr spMultiLanguage = GetMultiLanguage();
if (spMultiLanguage == NULL)
{
return E_FAIL;
}
hr = spMultiLanguage->GetCharsetInfo(Charset, pCharsetInfo);
if (FAILED(hr))
{
return hr;
}
}
catch (...)
{
return E_FAIL;
}
return hr;
}
static IMultiLanguagePtr GetMultiLanguage()
{
HRESULT hr = S_OK;
IMultiLanguagePtr spMultiLanguage;
hr = spMultiLanguage.CreateInstance(__uuidof(CMultiLanguage));
if (FAILED(hr))
{
return NULL;
}
return spMultiLanguage;
}