aodama.gif(0.97KB) C 言語で URL エンコード(β版)

 Referer ログを見てたら、 どうやら「URLエンコード関数 C言語」で検索された方がおられたようで、 なんとなく C 言語で URL エンコード関数を作ってみたくなりました(^^;
 しかし私は VC++ を購入したはよいものの、仕事に釣りにパチンコに忙しくてほとんど C 言語には手をつけていません。 関数名・変数名の付け方の規約もあまり知らないし、 結局こんなめちゃくちゃで汚いソースになってしまいました。 でも一応ちゃんと動くみたいです(笑)。これはあくまでも「参考」程度にとどめて、悪いところを直して使って下さいね。
 Visual Basic 用の URL エンコード関数はこちらです。

#include <stdio.h>
#include <string.h>
/*
----- UrlEncode 関数 for C 言語 Version 1.02 Beta -----
(C)2002 けるべ
MAIL : NULL
HOME : http://www.geocities.co.jp/SilkRoad/4511/

引数として与えられた文字列を URL エンコードした文字列を返します。
なお、現バージョンでは ANSI/S-JIS のみ対応です。

引数 *csource
    URL エンコードしたい文字列へのポインタを指定します。

引数 *cbuffer
    URL エンコードされた文字列が格納されるバッファへのポインタを指定します。
    なお、引数 *csource に指定した文字列サイズの 3 倍 + 1 以上のサイズが
    必要となります。

引数 lbuffersize
    cbuffer のバッファサイズを指定します。

戻り値
    関数が成功すると、cbuffer に URL エンコードされた文字列が格納され、
    cbuffer バッファに書き込まれた文字数(終端の NULL 文字を除く)が
    返ります。失敗した場合は 0 が返ります。

この URL エンコード関数は拙作の VB 用 UrlEncode 関数を、強引に C 言語用に
書き換えたものです。私は C 言語については全くの初心者ですので、
ソースもいいかげんです。正しく直して使って下さい(^^;
*/
unsigned long UrlEncode(unsigned char   *csource,
                        unsigned char   *cbuffer,
                        unsigned long   lbuffersize)
{
    unsigned long   llength;                                        /* csource のサイズを格納 */
    unsigned long   lcount = 0;                                     /* csource の読み込み位置カウンタ */
    unsigned char   cbyte;                                          /* 抜き出された 1 バイト分のデータを格納 */
    unsigned char   ctemp[4];                                       /* 変換結果(1 文字分)一時格納バッファ */
    unsigned long   lresultcount = 0;                               /* cbuffer の書き込み位置カウンタ */

    llength = (unsigned long)strlen(csource);                       /* csource の文字サイズを得る */
    if(!llength) { return lresultcount; }                           /* csource が 0 文字の場合、関数を抜ける */
    if(lbuffersize < (llength * 3 + 1)) { return lresultcount; }    /* バッファサイズが足りない場合、関数を抜ける */

    while(1) {
        cbyte = *(csource + lcount);                                /* 1 バイトを抜き出す */
        if( ((cbyte >= 0x81) && (cbyte <= 0x9F)) ||
            ((cbyte >= 0xE0) && (cbyte <= 0xEF)) ) {                /* Shift-JIS 2 バイト文字だった場合 */
            sprintf(ctemp, "%%%02X", cbyte);                        /* URL エンコード(上位バイト) */
            strncpy(cbuffer + lresultcount, ctemp, 4);              /* cbuffer にコピー */
            lcount++;                                               /* 読み込みカウンタをインクリメント */
            lresultcount += 3;                                      /* 書き込みカウンタを 3 増やす */
            if(lcount == llength) { break; }                        /* 文字列の終端に達した場合、ループを抜ける */
            sprintf(ctemp, "%%%02X", *(csource + lcount));          /* URL エンコード(下位バイト) */
            strncpy(cbuffer + lresultcount, ctemp, 4);              /* cbuffer にコピー */
            lcount++;                                               /* 読み込みカウンタをインクリメント */
            lresultcount += 3;                                      /* 書き込みカウンタを 3 増やす */
        } else if(cbyte == 0x20) {                                  /* 1 バイト半角スペース(" ")だった場合 */
            strncpy(cbuffer + lresultcount, "+", 2);                /* "+" を cbuffer にコピー */
            lcount++;                                               /* 読み込みカウンタをインクリメント */
            lresultcount++;                                         /* 書き込みカウンタをインクリメント */
        } else if( ((cbyte >= 0x40) && (cbyte <= 0x5A)) ||          /* @A-Z */
                   ((cbyte >= 0x61) && (cbyte <= 0x7A)) ||          /* a-z */
                   ((cbyte >= 0x30) && (cbyte <= 0x39)) ||          /* 0-9 */
                   (cbyte == 0x2A) ||                               /* "*" */
                   (cbyte == 0x2D) ||                               /* "-" */
                   (cbyte == 0x2E) ||                               /* "." */
                   (cbyte == 0x5F) ) {                              /* "_" */ /* 無変換文字だった場合 */
            strncpy(cbuffer + lresultcount, csource + lcount, 2);   /* そのまま cbuffer にコピー */
            lcount++;                                               /* 読み込みカウンタをインクリメント */
            lresultcount++;                                         /* 書き込みカウンタをインクリメント */
        } else {                                                    /* その他の文字の場合 */
            sprintf(ctemp, "%%%02X", cbyte);                        /* URL エンコード */
            strncpy(cbuffer + lresultcount, ctemp, 4);              /* cbuffer にコピー */
            lcount++;                                               /* 読み込みカウンタをインクリメント */
            lresultcount += 3;                                      /* 書き込みカウンタを 3 増やす */
        }
        if(lcount == llength) { break; }                            /* 文字列の終端に達した場合、ループを抜ける */
    }
    return lresultcount;                                            /* cbuffer に書き込んだ文字列のサイズを返す */
}

int main(void)
{
    char    ctest[255];
    char    cbuffer[766];

    printf("----- UrlEncode Test -----\n");
    printf("なんか入力してみて : ");
    fflush(stdout);
    scanf("%s", ctest);
    if(UrlEncode(ctest, cbuffer, 766)) {
        printf("%s\n", cbuffer);
    } else {
        printf("失敗したみたいよ。\n");
    }
    return 0;
}

べたテキスト版 : ダウンロードurlenc_c.txt (4.27KB) ※ 右クリックで「対象をファイルに保存(A)」して下さい


VBコーナーにもどる   トップページにもどる