C++写的encodeURIComponent

2023-10-26

 最近在用c++,找了几个库没有找到与javascript的URI编码相对应的函数。自己写一个,只写了编码,测试可以在javascript里用decodeURIComponent正常解码。

/**
 * uri编码字符串.
 * 
 * \param in 必须是utf-8编码的!
 * \return uri编码后的字符串。
 */
std::string encodeURIComponent(std::string in)
{
    std::stringstream ssUri;
    for (char c : in)
    {
        //0-9A-Za-z-_.!~*'()
        if ((c >= 'a' && c <= 'z') 
            || (c >= 'A' && c <= 'Z') 
            || (c >= '0' && c <= '9')
            || c == '!' 
            || (c >= '\'' && c <= '*') 
            || c == '-' 
            || c == '.' 
            || c== '_' 
            || c== '~')
        {
            ssUri << c;
        }
        else
        {
            ssUri << "%";
            if ((c & 0xf0) == 0)
                ssUri << 0;
            ssUri << setiosflags(ios::uppercase) << hex << (c & 0xff);
        }
    }
    return ssUri.str();
}

后来写的解码:

/**
 * URI解码.
 * 
 * \param in    URI编码的字符串。
 * \return  解码后的字符串,是utf-8编码的。
 */
std::string decodeURIComponent(std::string in)
{
    int               readFlag = 0;
    int               code     = 0;
    std::stringstream ssUri;
    for (char c : in)
    {
        if ((readFlag == 0) && (c == '%'))
        {
            readFlag = 1;
            continue;
        }
        else if (readFlag == 1)
        {
            if (isxdigit(c))
            {
                if (isdigit(c))
                    code = c - '0';
                else if (c >= 'A' && c <= 'F')
                    code = (0x0a+(c - 'A'));
                else
                    return std::string();
                readFlag = 2;
                continue;
            }
            else
            {
                return std::string();
            }
        }
        else if (readFlag == 2)
        {
            if (isxdigit(c))
            {
                code <<= 4;
                if (isdigit(c))
                    code |= (c - '0');
                else if (c >= 'A' && c <= 'F')
                    code |= (0x0a+(c - 'A'));
                else
                    return std::string();
                ssUri << (char) (code & 0xff);
                code     = 0;
                readFlag = 0;
                continue;
            }
            else
            {
                return std::string();
            }
        }
        else
        {
            ssUri << c;
        }
    }
    return ssUri.str();
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++写的encodeURIComponent 的相关文章

随机推荐

  • asp.net毕业设计题目选择

    1 asp net 超市管理系统 rar 2 客户关系系统 rar 3 ASP NET BS结构的城市酒店入住信息管理系统的设计 源代码 论文 rar 4 asp net FTP客户端设计与开发 源代码 论文 rar 5 ASP NET 网
  • DNS 配置错误

    curl 6 Could not resolve host 今天看 ttrss 的时候发现文章都是两天前的了 感觉不太对劲 经过查验提示curl 6 Could not resolve host 在查找过资料后 是 DNS 出现了 下面给出
  • 前端工程化(2):postCss 和 babel的使用

    前端工程化 2 postCss 和 babel的使用 本文例子可以点击这里 0 前言 babel是什么 官网给出的定义 Babel 是一个工具链 主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript
  • eclipse was unable to locate its companion shared library

    当转移或者Copy工程时 eclipse was unable to locate its companion shared library eclipse ini 里面的路径配置错误导致 launcher library C Users
  • 三个好用前端编辑工具推荐+推荐原因(VSCode、WebStrom、HbuilderX 的推荐对比,不纠结 !)

    市面上编辑器挺多的 之前写过一期 一年了 更新一下 先上结论 如果 电脑配置差 颜狗 建议用VSCode 如果 你认为你0基础还笨 建议用Hbuider培养兴趣 否则 WebStorm 暂时是前端写代码的无二选择 或者 我全都要 以下是个人
  • 泛型类, 泛型接口的继承, 委托, 反射

    使用泛型定义一个父类 using System using System Collections Generic using System Linq using System Text using System Threading Task
  • 编译原理之LL(1) 、LR(0)、SLR、LR(1)、LALR文法的对比

    欢迎关注我的个人博客 www zuzhiang cn 考完编译原理有一段时间了 记得当时都被以上这五种文法搞懵了 所以希望写篇文章帮助那些正在学习的人 以下内容是依据龙书中文版讲解的 由于老师不同可能某些地方大同小异 如有什么纰漏之处还请指
  • 【更新中】目标检测——梳理,准备面试

    最近在准备找工作面试 本文在此梳理了目标检测中涉及的面试要用的知识点 包含了一下几方面 My paper reading 过程总结 实际步骤 所花时间 评价 改进 先看了abstract 1 introduction 以及 4 relate
  • 【图像处理】Hough直线变换

    I 直线篇 1 直线是如何表示的 对于平面中的一条直线 在笛卡尔坐标系中 常见的有点斜式 两点式两种表示方法 然而在hough变换中 考虑的是另外一种表示方式 使用 r theta 来表示一条直线 其中r为该直线到原点的距离 theta为该
  • web前端进化之路(一)——小程序开发

    最近学习前端感觉很多知识学起来容易 但是很多知识点很容易忘记 想做一个工具来方便自己来学习 正好结合小程序 分享给大家 照顾初学者 可能讲的比较细 理解哈 准备工具 小程序一个 已申请 名称是 web前端进化之路 比目后端云 作为服务器后端
  • linux下创建多线程执行

    linux下创建多线程执行 线程 thread 台湾称 执行绪 是 进程 中某个单一顺序的控制流 也被称为轻量进程 lightweight processes 计算机科学术语 指运行中的程序的调度单位 线程是操作系统能够进行运算调度的最小单
  • 在嵌入式学习困惑:做驱动开发还是做应用开发更有前途

    在嵌入式学习过程中 很多人都有这样的困惑 意思就是说 你告诉我哪个更有前途 我就好好学哪个 另外一个就不用学了 问这种问题的同事往往会同时问另外一些问题 我以后就想做驱动开发 你教我这些应用开发的技术有什么用 C 用得多吗 学了有什么用 我
  • 黑苹果必备技能之一:升级OC(open core)引导

    目前来说 安装黑苹果的用户大部分应该都是采用的clover以及OC引导 目前由于OC引导的不断完善以及配置方法更简单 有不少用户都已经从clover引导转变到了OC引导 而关于使用OC引导安装黑苹果的教程大家可以去参考之前发布的文章 此篇文
  • 实现回到顶部功能的三种方法

    1 使用锚点 页面顶部放置一个锚点链接 然后在页面下方放置一个返回到该锚点的链接 用户点击该链接即可返回到该锚点所在的顶部位置 锚点方式 div div a href topAnchor 回到顶部 a 2 监听浏览器的scollTop事件
  • VHDL程序:四位乘法器

    VHDL程序 四位乘法器 1 IF语句行为级描述 library ieee use ieee std logic 1164 all use ieee std logic unsigned all entity multip 4 is por
  • 前端 echarts 导出图片到excel中

    这里演示的demo是基于react的 yarn add exceljs file saver echarts 首先安装以上三个包 直接使用下列代码即可 import React Component from react import App
  • FISCO BCOS(二十一)——— 实现对byte32[]数组类型的输入

    如果对一个byte32 类型的数组进行传参 我们先看一下一个string类型转成16进制是什么样的 字符串与进制转换http www ku51 net ox2str 在区块链中地址一般是0x开头 也就是16进制标识 比特币不是 所以在这里要
  • c++的可视化计算器

    学生党的一个课程设计 希望可以对有些人有些帮助 第一次发 不好的话请多多原谅 c 一 题目要求 设计一个可视化的计算器 可以执行 等操作 要求使用API来编写程序 我的计算器输入的时候是以 号开始 二 需求分析 1 问题描述 用api来编写
  • 解决easyUI 1.2.6 + datagrid在 IE浏览器下无法重新加载、查询

    I easyUI 1 2 6 datagrid在 IE浏览器目前存在的问题 1 无法重新加载 查询 var row dg user table datagrid getSelected dg userPri table datagrid m
  • C++写的encodeURIComponent

    最近在用c 找了几个库没有找到与javascript的URI编码相对应的函数 自己写一个 只写了编码 测试可以在javascript里用decodeURIComponent正常解码 uri编码字符串 param in 必须是utf 8编码的