キャラクタセットからコードページの取得[MLang]

(2004.04.22)
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;
    }
一覧に戻る
© 2003 WAC.com All Right Reserved.