即席で作った。

#include <string.h>
#include <ctype.h>

/*
 * Encodes src string into dst, returns dst itself.
 */
char *url_encode(const char *src, char *dst)
{
    int c;
    const char *rfc2396_mark = "-_.!~*'()";
    char *result = dst;
    
    while (c = *src++) {
        c &= 0xff;
        if (isalnum(c) || strchr(rfc2396_mark, c))
            *dst++ = c;
        else if (c == ' ')
            *dst++ = '+';
        else
            dst += sprintf(dst, "%%%02X", c);
    }
    *dst = 0;
    return result;
}