字符串进行 URL 编码处理

news2024/11/24 10:42:08
// URL_test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// 判断字符是否需要进行 URL 编码
static bool needs_encoding(char c)
{
  if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
      (c >= '0' && c <= '9') || c == '_' || c == '.' || c == ':' || c == '-' || c == '/' || c == '?' || c == '&' || c == '=')
  {
    return false;
  }
  return true;
}

// 对字符进行 URL 编码,返回编码后的字符串
static char *url_encode_char(char c)
{
  static char hex[] = "0123456789ABCDEF";
  char *encoded = (char *)malloc(4);
  if (encoded)
  {
    encoded[0] = '%';
    encoded[1] = hex[(c >> 4) & 0x0F];
    encoded[2] = hex[c & 0x0F];
    encoded[3] = '\0';
  }
  return encoded;
}

// 对字符串进行 URL 编码,返回编码后的字符串
char *encode_uri(const char *str)
{
  int len = strlen(str);
  char *encoded = (char *)malloc(3 * len + 1);
  if (encoded)
  {
    int pos = 0;
    for (int i = 0; i < len; i++)
    {
      if (needs_encoding(str[i]))
      {
        char *encoded_char = url_encode_char(str[i]);
        if (encoded_char)
        {
          strcpy(&encoded[pos], encoded_char);
          pos += 3;
          free(encoded_char);
        }
      }
      else
      {
        encoded[pos++] = str[i];
      }
    }
    encoded[pos] = '\0';
  }
  return encoded;
}

int main()
{

  const char *uri = "http://www.test.url编码处理测试.png";
  char *encoded_uri = encode_uri(uri);
  if (encoded_uri)
  {
    printf("原始 URI: %s\n", uri);
    printf("编码后 URI: %s\n", encoded_uri);
    free(encoded_uri);
  }
  else
  {
    printf("URI 编码失败\n");
  }
  return 0;
}

运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣第538题 把二叉搜索树转换为累加树 c++

题目 538. 把二叉搜索树转换为累加树 中等 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值…

相似性搜索:第 3 部分--混合倒排文件索引和产品量化

接续前文&#xff1a;相似性搜索&#xff1a;第 2 部分&#xff1a;产品量化 SImilarity 搜索是一个问题&#xff0c;给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 一、介绍 在数据科学中&#xff0c;相似性搜索经常出现在NLP领域&#xff0c;搜索引擎或推…

【RocketMQ系列二】通过docker部署单机RocketMQ

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

goland安装教程

安装版本&#xff1a; goland-2023.2.3.exe

(滑动窗口) 76. 最小覆盖子串 ——【Leetcode每日一题】

❓76. 最小覆盖子串 难度&#xff1a;困难 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串…

C语言 sizeof

定义 sizeof是C语言的一种单目操作符。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 使用方法 用于数据类型 sizeof(type) 数据类型必须用括号括住 用于变量 size…

C#,数值计算——数据建模Proposal的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Proposal { public Normaldev gau { get; set; } null; private double logstep { get; set; } public Proposal(int ranseed, double lstep) { this.gau…

OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理

OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台&#xff0c;它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台&#xff0c;用户可以收集和处理来自不同设备的传感器数据&#xff0c;适用于智…

办理400电话客服中心的申请步骤及注意事项

引言&#xff1a; 在现代商业环境中&#xff0c;提供优质的客户服务是企业成功的关键之一。而办理400电话客服中心可以帮助企业建立一个高效、专业的客户服务团队&#xff0c;提升客户满意度和忠诚度。本文将介绍办理400电话客服中心的申请步骤及注意事项&#xff0c;帮助企业顺…

java: 无效的目标发行版: 11

第一步&#xff1a; 第二步&#xff1a; 第三步

BGP初解笔记

BGP&#xff08;公网用得多&#xff09;&#xff1a; 一、名词&#xff1a; 1、BGP speaker&#xff1a;启用了BGP进程的路由器 2、BGP对等体&#xff1a;双方建立BGP邻居关系的设备&#xff1a; a.IBGP对等体&#xff0c;AS号一致&#xff0c;为IBGP对等体&#xff0c;有水…

如何做好商品的库存管理?哪些指标是衡量库存的指标

如何做好商品的库存管理&#xff1f;哪些指标是衡量库存的指标&#xff1f;库存分析的方法繁杂且广泛&#xff0c;选择正确的方法才能更好的进行库存分析。 本文将为大家盘点一些常用的库存分析方法和监控指标&#xff0c;全程干货&#xff0c;建议收藏&#xff01; 01 如何进…

网络编程中的重难点:套接字的应用和理解

什么是网络编程 网络编程&#xff0c;指的是网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或成为网络数据传输&#xff09;。 发送端和接收端 在一次网络数据传输时&#xff1a; 发送端&#xff1a;数据的发送方进程&#xff0…

GD32F103 ADC

1. 模拟量于数字量。 模拟量&#xff1a;反应真实世界中的物理量&#xff08;比如温度&#xff0c;压力&#xff0c;长度&#xff09;模拟量通常是通过电压&#xff0c;电流等信号来表示。 数字量&#xff1a;通常是0和1来表示某个物理量的变化。 2. ADC&#xff08;模拟量转…

通过HTTP发送大量数据的三种方法

在网络的早期时期&#xff0c;人们发送的文件大小仅为几KB。到了2023年&#xff0c;我们享受着高分辨率的MB级别图像&#xff0c;并在几GB的4K&#xff08;即将是8K&#xff09;视频中观看。 即使有良好的互联网连接&#xff0c;下载一个5GB的文件仍然需要一些时间。如果你拥有…

Photoshop 2024正式发布!内置最新PS AI,创意填充等功能无限制使用!

PS正式版目前更新到了2024&#xff0c;版本为25.0。 安装教程 1、下载得到安装包后&#xff0c;先解压。鼠标右键&#xff0c;【解压到当前文件夹】 2、双击 Set-up 开始安装 3、这里可以更改安装位置。如果C盘空间不够大&#xff0c;可以把它安装到C盘以外。更改好后&#x…

SpringBoot面试题3:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? Spring Boot 的核心注解是 @SpringBootApplication。 @SpringBootApplication 是一…

【idea】 java: 找不到符号

idea 启动时提示 java: 找不到符号 java: 找不到符号 符号: 方法 getCompanyDisputeCount() 位置: 类型为com.yang.entity.AreaAnalyse的变量 areaAnalyse 在setting ——> Compiler ——>Shared build process VM options: 添加&#xff1a; -Djps.track.ap.dep…

Vue3<script setup>语法糖下,实现父子组件通信以及数据监听的三种方法。

在Vue3的script setup语法糖中&#xff0c;没有办法通过Vue2的ref、props、parent、中央时间总线等等众多方法&#xff0c;通过this指针简单的实现父子组件的通信&#xff0c;网络上也很少有关于script setup语法糖的相关教程&#xff0c;所以决定自己写一个详细教程&#xff0…

【算法|动态规划No.19】leetcode413. 等差数列划分

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…