从Cookie 中取出来对特殊字符的转换

2023-11-01

    页面存入Cookie中的值含有特殊字符,但所传的值中包含一些特殊字符比如“:”,Cookie中是无法对特殊字符直接承载的,所以在存入Cookie时,将其转换为unicode编码:
document.cookie = key + "=" + escape(value);
但在action中如果直接取得,是无法将特殊字符的unicode编码转换为想要的,上网搜查相关资料,找到了用java编写的unicode编码的转换的工具类,工程中的Escape就是该工具类,在action中用
String code = Escape.unescape(cookies[i].getValue());

方法转换后就可以将unicode转为我想要的特殊字符。 

下面是Escape.java的源代码:

public class Escape
{
    private final static String[] hex = { "00", "01", "02", "03", "04", "05",
            "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", "10",
            "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B",
            "1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25", "26",
            "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31",
            "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C",
            "3D", "3E", "3F", "40", "41", "42", "43", "44", "45", "46", "47",
            "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", "50", "51", "52",
            "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D",
            "5E", "5F", "60", "61", "62", "63", "64", "65", "66", "67", "68",
            "69", "6A", "6B", "6C", "6D", "6E", "6F", "70", "71", "72", "73",
            "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E",
            "7F", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
            "8A", "8B", "8C", "8D", "8E", "8F", "90", "91", "92", "93", "94",
            "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
            "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA",
            "AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3", "B4", "B5",
            "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", "C0",
            "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB",
            "CC", "CD", "CE", "CF", "D0", "D1", "D2", "D3", "D4", "D5", "D6",
            "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", "E0", "E1",
            "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC",
            "ED", "EE", "EF", "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7",
            "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" };

    private final static byte[] val = { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x01,
            0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
            0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F };

    /**
     * <p>Discription:[加码]</p>
     * @param s
     * @return
     * @author:[许狄]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public static String escape(String s)
    {
        StringBuffer sbuf = new StringBuffer();
        int len = s.length();
        for (int i = 0; i < len; i++)
        {
            int ch = s.charAt(i);
            if (ch == ' ')
            { // space : map to '+'
                sbuf.append('+');
            }
            else if ('A' <= ch && ch <= 'Z')
            { // 'A'..'Z' : as it was
                sbuf.append((char) ch);
            }
            else if ('a' <= ch && ch <= 'z')
            { // 'a'..'z' : as it was
                sbuf.append((char) ch);
            }
            else if ('0' <= ch && ch <= '9')
            { // '0'..'9' : as it was
                sbuf.append((char) ch);
            }
            else if (ch == '-' || ch == '_' // unreserved : as it was
                    || ch == '.' || ch == '!' || ch == '~' || ch == '*'
                    || ch == '/'' || ch == '(' || ch == ')')
            {
                sbuf.append((char) ch);
            }
            else if (ch <= 0x007F)
            { // other ASCII : map to %XX
                sbuf.append('%');
                sbuf.append(hex[ch]);
            }
            else
            { // unicode : map to %uXXXX
                sbuf.append('%');
                sbuf.append('u');
                sbuf.append(hex[(ch >>> 8)]);
                sbuf.append(hex[(0x00FF & ch)]);
            }
        }
        return sbuf.toString();
    }

    /**
     * <p>Discription:[解码]</p>
     * @param s
     * @return
     * @author:[许狄]
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public static String unescape(String s)
    {
        StringBuffer sbuf = new StringBuffer();
        int i = 0;
        int len = s.length();
        while (i < len)
        {
            int ch = s.charAt(i);
            if (ch == '+')
            { // + : map to ' '
                sbuf.append(' ');
            }
            else if ('A' <= ch && ch <= 'Z')
            { // 'A'..'Z' : as it was
                sbuf.append((char) ch);
            }
            else if ('a' <= ch && ch <= 'z')
            { // 'a'..'z' : as it was
                sbuf.append((char) ch);
            }
            else if ('0' <= ch && ch <= '9')
            { // '0'..'9' : as it was
                sbuf.append((char) ch);
            }
            else if (ch == '-' || ch == '_' // unreserved : as it was
                    || ch == '.' || ch == '!' || ch == '~' || ch == '*'
                    || ch == '/'' || ch == '(' || ch == ')')
            {
                sbuf.append((char) ch);
            }
            else if (ch == '%')
            {
                int cint = 0;
                if ('u' != s.charAt(i + 1))
                { // %XX : map to ascii(XX)
                    cint = (cint << 4) | Escape.val[s.charAt(i + 1)];
                    cint = (cint << 4) |  Escape.val[s.charAt(i + 2)];
                    i += 2;
                }
                else
                { // %uXXXX : map to unicode(XXXX)
                    cint = (cint << 4) |  Escape.val[s.charAt(i + 2)];
                    cint = (cint << 4) |  Escape.val[s.charAt(i + 3)];
                    cint = (cint << 4) |  Escape.val[s.charAt(i + 4)];
                    cint = (cint << 4) |  Escape.val[s.charAt(i + 5)];
                    i += 5;
                }
                sbuf.append((char) cint);
            }
            i++;
        }
        return sbuf.toString();
    }

}

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

从Cookie 中取出来对特殊字符的转换 的相关文章

随机推荐

  • 【Unity3D自学记录】Unity3D之KeyCode键值

    Backspace 退格键 Delete Delete键 TabTab键 Clear Clear键 Return 回车键 Pause 暂停键 Escape ESC键 Space 空格键 Keypad0 小键盘0 Keypad1 小键盘1 K
  • 为什么要在C ++ 11中使用“override”说明符?

    如果您知道Java 那么您可能已经很熟悉Java了 这对您来说可能是完全简单的 Override annotation 如果您一直使用C C 进行编码 那么这可能是新的 您可能会问自己一个问题 为什么在不必要的时候为什么要放一个额外的说明符
  • 数独基本规则_数独入门:你必须掌握的那些规则和技巧

    很多人想涉足数独领域 但苦于不知该如何入门和上手 甭愁了 北京市数独运动协会贴心地为菜鸟们总结了这一篇数独的元素 规则和技巧 满满的都是干货 如果你看完还觉得不够过瘾 那就移步至数独女王的达人攻略 接受高阶的训练和挑战吧 数独的规则 在空格
  • 获取OpenHarmony源码:从DevEco Marketplace获取(2)

    引言 OpenHarmony源码的获取方式有三种 从gitee GitHub等基于git的代码托管平台获取 从华为的DevEco Marketplace网站获取 从镜像站点获取 本文介绍如何在Ubuntu版本的DevEco Device T
  • 大数据知识目录

    第一阶段 安装虚拟机 第二阶段 Linux操作系统 第三阶段 zookeeper分布式协调服务框架 第四阶段 Hadoop分布式文件系统HDFS 第五阶段 Hadoop分布式计算Mapreduce和资源管理 第六阶段 数据仓库Hive 第七
  • 对于uts namespace共享的测试

    前言 单单以下列命令运行虽然是root 还不行 我们需要加 privileged 不然会报 hostname you must be root to change the host name docker run it uts host u
  • python写程序计算无穷级数_圆周率 π 展开 为 无穷级数

    圆周率 展开 为 无穷级数 其实 很简单 如图 可以用 黄色小三角形 和 橙色小三角形 以及 依此类推 下去 的 无数个 小三角形 来 逼近 圆面积 把 这个 无限逼近 的 圆面积 称为 S 因为 圆面积 r 所以 有 S r S r 即
  • 【VC++类型转换】CString和System::String类型的转换

    1 CString 转换为System String类型 这里的CString是指MFC的CString System String为CLR中的字符串类 我认为最简单的做法是 CString text System String str1
  • 【HBZ分享】Mysql的InnoDB原理

    没有配置主键时Mysql的InnoDB是如何做的 Mysql会使用自带的rowid作为主键 InnoDB的底层数据结构是什么 B Tree BTree的特点 MyISAM 非聚集索引 即 索引 和 对应数据 是分开的两个文件 找到对应数据后
  • 两年来主要工作框架图

    两年来主要工作框架图 包含了从MES到SAP的全程流程 从收集一线数据开始到汇总历史数据 归档 直到最后的BI DW分析展现 主要工作流程图
  • Java中正则表达式的使用

    在Java中 我们为了查找某个给定字符串中是否有需要查找的某个字符或者子字串 或者对字符串进行分割 或者对字符串一些字符进行替换 删除 一般会通过if else for 的配合使用来实现这些功能 如下所示 Java代码 public cla
  • 以互联网思维做好客户端软件

    加入爱奇艺的时间不长 但我感受到的震撼却不小 在外企打拼了十几个春秋 今年终于有机会进入一家国内顶尖的互联网企业 真真切切地有一番不太一样的体验 不过 我今天并不想说在外企工作与国内企业的差别 目前 我负责 爱奇艺PPS影音 PC客户端软件
  • 2种方法简单爬取JS加载的动态数据

    参考原文 http www cnblogs com buzhizhitong p 5697683 html 需要爬取的网站数据 http gkcx eol cn soudaxue queryProvince html page 1 一共是1
  • webdriver相关API

    webdriver相关API 一 元素的定位 二 操作测试对象 三 添加等待 四 打印信息 五 浏览器的操作 六 键盘事件 七 鼠标事件 一 元素的定位 webdriver提供的常用的对象定位方法 id 页面内 id 唯一 name cla
  • vector C++ 详细用法

    原文地址 http blog csdn net edify article details 4035243 vector是C 标准模板库中的部分内容 它是一个多功能的 能够操作多种数据结构和算法的模板类和函数库 vector之所以被认为是一
  • 压测注意事项

    文章目录 常用术语 流程及注意事项 常用工具 ab 命令 Jmeter 声明这里只是面向RD的 简单的 为摸清服务性能相关的自压测笔记 正规压测请向QA同学请教 常用术语 QPS 每秒请求数 也是吞吐量 内存使用情况 CPU使用情况 针对计
  • 企业级镜像仓库Harbor的部署及使用

    文章目录 一 环境准备 二 下载 三 HTTPS证书 1 生成证书颁发机构证书 2 生成服务器证书 3 提供证书给Harbor和Docker 四 Harbor配置文件 五 安装 六 Web页面 七 上传及拉取镜像 1 配置 2 上传镜像 3
  • ubuntu彻底卸载ffmpeg 与安装

    卸载 卸载旧的FFmpeg 输入以下指令 sudo apt get purge remove ffmpeg sudo apt get purge autoremove 当时试了一下 并没有成功 命令行输入 ffmpeg version 当时
  • 计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

    这里写目录标题 GoogLeNet 参考 GoogLeNet模型结构 创新点 Inception结构 它能保留输入信号中的更多特征信息 去掉了AlexNet的前两个全连接层 并采用了平均池化 引入了辅助分类器 GoogLeNet GoogL
  • 从Cookie 中取出来对特殊字符的转换

    页面存入Cookie中的值含有特殊字符 但所传的值中包含一些特殊字符比如 Cookie中是无法对特殊字符直接承载的 所以在存入Cookie时 将其转换为unicode编码 document cookie key escape value 但