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

(图片来源网络,侵删)
方法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;
}
注意事项
- 确保目标缓冲区足够大,避免缓冲区溢出
- URL编码通常将空格转换为
%20,但在某些情况下可能需要转换为 - 编码后的字符串长度通常比原始字符串长(每个非ASCII字符可能需要3个字节)
- 对于生产环境,建议使用成熟的库而不是自己实现
代码提供了基本的URL编码功能,你可以根据实际需求进行调整和扩展。

(图片来源网络,侵删)
