C语言如何实现URL编码?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

C语言实现URL编码

URL编码(也称为百分比编码)是一种将URL中的非ASCII字符转换为安全表示形式的方法,在C语言中,你可以通过以下几种方式实现URL编码:

urlencode c语言
(图片来源网络,侵删)

方法1:手动实现

#include <stdio.h>
#include <ctype.h>
#include <string.h>
// URL编码函数
void url_encode(const char *src, char *dst, int dst_size) {
    const char *p = src;
    char *d = dst;
    int dst_len = 0;
    while (*p && dst_len < dst_size - 1) {
        if (isalnum(*p) || *p == '-' || *p == '_' || *p == '.' || *p == '~') {
            *d++ = *p;
            dst_len++;
        } else {
            // 非安全字符转换为%XX格式
            if (dst_len + 4 > dst_size) break; // 确保有足够空间
            snprintf(d, 4, "%%%02X", (unsigned char)*p);
            d += 3;
            dst_len += 3;
        }
        p++;
    }
    *d = '\0';
}
int main() {
    const char *url = "Hello World! 你好";
    char encoded[256];
    url_encode(url, encoded, sizeof(encoded));
    printf("Original: %s\n", url);
    printf("Encoded: %s\n", encoded);
    return 0;
}

方法2:使用标准库函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 更完整的URL编码实现
void url_encode_full(const char *src, char *dst, size_t dst_size) {
    const unsigned char *p = (const unsigned char *)src;
    char *d = dst;
    size_t dst_len = 0;
    while (*p && dst_len < dst_size - 1) {
        if (isalnum(*p) || *p == '-' || *p == '_' || *p == '.' || *p == '~') {
            *d++ = *p;
            dst_len++;
        } else if (*p == ' ') {
            if (dst_len + 1 >= dst_size) break;
            *d++ = '+';
            dst_len++;
        } else {
            if (dst_len + 4 > dst_size) break;
            snprintf(d, 4, "%%%02X", *p);
            d += 3;
            dst_len += 3;
        }
        p++;
    }
    *d = '\0';
}
int main() {
    const char *url = "test@example.com/path with spaces?query=value#fragment";
    char encoded[512];
    url_encode_full(url, encoded, sizeof(encoded));
    printf("Original: %s\n", url);
    printf("Encoded: %s\n", encoded);
    return 0;
}

方法3:使用第三方库

对于更复杂的需求,可以使用现成的库如libcurl:

#include <curl/curl.h>
#include <stdio.h>
int main() {
    CURL *curl = curl_easy_init();
    if (curl) {
        const char *url = "Hello World! 你好";
        char *encoded = curl_easy_escape(curl, url, 0);
        if (encoded) {
            printf("Original: %s\n", url);
            printf("Encoded: %s\n", encoded);
            curl_free(encoded);
        }
        curl_easy_cleanup(curl);
    }
    return 0;
}

注意事项

  1. 确保目标缓冲区足够大,避免缓冲区溢出
  2. URL编码通常将空格转换为%20,但在某些情况下可能需要转换为
  3. 编码后的字符串长度通常比原始字符串长(每个非ASCII字符可能需要3个字节)
  4. 对于生产环境,建议使用成熟的库而不是自己实现

代码提供了基本的URL编码功能,你可以根据实际需求进行调整和扩展。

urlencode c语言
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
移动站m目录重复如何解决?
« 上一篇 03-02
C语言InitStack函数如何正确初始化栈?
下一篇 » 03-02
取消
微信二维码
支付宝二维码

目录[+]