EUCエンコードとURLエンコードについて

※開発環境は、Windows2000sp4/IE6sp1/VC++6.0sp6/ATL3.0/WTL7.0

上記の開発環境で、ShiftJISコードの文字列をEUCコードの文字列に変換します。 Webで検索してみても、自分にとってあまり使いやすいものが見つからなかったので、自作しました。

早速、覚書です。LPCTSTR のShiftJIS文字列を LPTSTR のEUC文字列にエンコードするソースコードです。 ただし、UNICODE環境によるビルドは想定されていません。

コード1:EUCエンコード

    typedef const BYTE far *LPCBYTE;

    BOOL SJIStoEUC(CString& r_strWord)
    {
        if(r_strWord.IsEmpty()){
            return FALSE; // no data
        }

        const size_t iLenSJIS = r_strWord.GetLength();
        LPCBYTE pszSJIS = reinterpret_cast<LPCBYTE>(static_cast<LPCTSTR>(r_strWord));
        LPBYTE pszEUC = reinterpret_cast<LPBYTE>(alloca(iLenSJIS << 1));
        LPBYTE psz = pszEUC;
        BYTE c1, c2;

        for(size_t i = 0; i < iLenSJIS; i++){
            // 下位7ビットのみで構成される部分は同じ
            if(*pszSJIS < 0x80){
                *psz++ = *pszSJIS++;
                continue;
            }

            // 半角カナの処理
            if(*pszSJIS >= 0xA1 && *pszSJIS <= 0xDF){
                *psz++ = 0x8E;
                *psz++ = *pszSJIS++;
                continue;
            }

            // 有効な2バイト文字かチェック
            c1 = *pszSJIS++;
            if(!*pszSJIS){
                break;
            }
            c2 = *pszSJIS++;

            // 2バイト文字の変換
            c1 <<= 1;
            if(c2 < 0x9F){
                if(c1 < 0x3F)  c1 -= 0x61;
                else           c1 += 0x1F;
                if(c2 > 0x7E)  c2 += 0x60;
                else           c2 += 0x61;
            }else{
                if(c1 < 0x3F)  c1 -= 0x60;
                else           c1 += 0x20;
                c2 += 0x02;
            }

            // 変換後の値をセット
            *psz++ = c1;
            *psz++ = c2;
        }

        // 終端文字を追加
        *psz = 0;

        // 変換終了
        r_strWord = pszEUC;

        return TRUE;
    }

ブラウザ等で使用されるURL(URI)で利用可能な文字は限定されるが、これにバイナリデータを渡したい場合がある。 しかし、通常のURLで使用できないコードはURLエンコードという技法によって解決できる。 これは、URIで表現できないデータのみを有効な形式にエンコードする方法と、いっそ、すべてのデータをエンコードしてしまう方法が選択できる。 ここでは、すべてのデータをURLエンコードする例を掲載する。

コード2:URLエンコード

    typedef const BYTE far *LPCBYTE;

    // to %% string
    // r_strText:変換後文字列格納先、lpa:変換元文字列、nBytes:変換元文字列のバイト数
    void toEncodeString(CString& r_strText, LPCSTR lpa, const int nBytes)
    {
        LPCBYTE lpByte = reinterpret_cast<LPCBYTE>(lpa);

        // 1バイトの文字を %XX 形式にするため、3倍、そして終端文字分
        LPTSTR lptConvert = r_strText.GetBuffer( nBytes * 3 + 1 );

        // 終端文字に達するまで処理続行
        for(size_t i = 0; lpByte[i]; ++i){
            lptConvert += ::wsprintf(lptConvert, _T("%%%02X"), lpByte[i]);
        }

        // 終端文字の付加
        *lptConvert = 0;

        // 変換終了
        r_strText.ReleaseBuffer();
    }


[HOME]-[RTL]
Copyright© 2004 RAPT.