EscapeAndUnescapeUtil【java模拟js的escape和unescape函数】

版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

在这里做一个记录,基本代码同参考资料《java模拟js的escape和unescape函数》一样。

效果图

     

代码分析

escape : 编码,模拟js的escape函数;

unescape : 解码,模拟js的unescape函数。

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

(1)将EscapeAndUnescapeUtil复制到项目中

package com.why.project.androidcnblogsdemo.utils;

/**
 * Created by HaiyuKing
 * Used  java模拟js的escape和unescape函数 \u003C == <
 * http://blog.csdn.net/lululove19870526/article/details/47424091
 * http://blog.csdn.net/hujingn/article/details/5791130
 */

public class EscapeAndUnescapeUtil {
    private 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 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 };

    /**
     * 编码,模拟js的escape函数.<br>
     * escape不编码字符有69个:*+-./@_0-9a-zA-Z
     *
     * @param s 字符串
     * @return 转义后的字符串或者null
     */
    public static String escape(String s) {
        if (s == null) {
            return null;
        }
        StringBuffer sbuf = new StringBuffer();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            int ch = s.charAt(i);
            if ('A' <= ch && ch <= 'Z') {
                sbuf.append((char) ch);
            } else if ('a' <= ch && ch <= 'z') {
                sbuf.append((char) ch);
            } else if ('0' <= ch && ch <= '9') {
                sbuf.append((char) ch);
            } else if (ch == '*' || ch == '+' || ch == '-' || ch == '/'
                    || ch == '_' || ch == '.' || ch == '@') {
                sbuf.append((char) ch);
            } else if (ch <= 0x007F) {
                sbuf.append('%');
                sbuf.append(hex[ch]);
            } else {
                sbuf.append('%');
                sbuf.append('u');
                sbuf.append(hex[(ch >>> 8)]);
                sbuf.append(hex[(0x00FF & ch)]);
            }
        }
        return sbuf.toString();
    }

    /**
     * 解码,模拟js的unescape函数. 说明:本方法保证 不论参数s是否经过escape()编码,均能得到正确的“解码”结果
     *
     * @param s
     * @return
     */
    public static String unescape(String s) {
        if (s == null) {
            return null;
        }
        StringBuffer sbuf = new StringBuffer();
        int i = 0;
        int len = s.length();
        while (i < len) {
            int ch = s.charAt(i);
            if ('A' <= ch && ch <= 'Z') {
                sbuf.append((char) ch);
            } else if ('a' <= ch && ch <= 'z') {
                sbuf.append((char) ch);
            } else if ('0' <= ch && ch <= '9') {
                sbuf.append((char) ch);
            } else if (ch == '*' || ch == '+' || ch == '-' || ch == '/'
                    || ch == '_' || ch == '.' || ch == '@') {
                sbuf.append((char) ch);
            } else if (ch == '%') {
                int cint = 0;
                if ('u' != s.charAt(i + 1)) {
                    cint = (cint << 4) | val[s.charAt(i + 1)];
                    cint = (cint << 4) | val[s.charAt(i + 2)];
                    i += 2;
                } else {
                    cint = (cint << 4) | val[s.charAt(i + 2)];
                    cint = (cint << 4) | val[s.charAt(i + 3)];
                    cint = (cint << 4) | val[s.charAt(i + 4)];
                    cint = (cint << 4) | val[s.charAt(i + 5)];
                    i += 5;
                }
                sbuf.append((char) cint);
            } else {
                sbuf.append((char) ch);
            }
            i++;
        }
        return sbuf.toString();
    }
}

三、使用方法

activity布局如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_escape"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="将“测试样例”进行escape编码"/>

    <Button
        android:id="@+id/btn_unescape"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="将“%u6D4B%u8BD5%u6837%u4F8B”进行unescape解码"/>

    <TextView
        android:id="@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>

</LinearLayout>
activity_escapeandunescapeutil.xml

activity使用如下

package com.why.project.androidcnblogsdemo.activity;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.why.project.androidcnblogsdemo.R;
import com.why.project.androidcnblogsdemo.utils.EscapeAndUnescapeUtil;

/**
 * Created by HaiyuKing
 * Used EscapeAndUnescapeUtil演示
 */

public class EscapeAndUnescapeUtilActivity extends AppCompatActivity {

    private Button btn_escape;
    private Button btn_unescape;
    private TextView tv_show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_escapeandunescapeutil);

        initVIews();
        initEvents();
    }

    private void initVIews() {
        btn_escape = (Button) findViewById(R.id.btn_escape);
        btn_unescape = (Button) findViewById(R.id.btn_unescape);
        tv_show = (TextView) findViewById(R.id.tv_show);
    }

    private void initEvents() {
        btn_escape.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv_show.setText(EscapeAndUnescapeUtil.escape("测试用例"));
            }
        });

        btn_unescape.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv_show.setText(EscapeAndUnescapeUtil.unescape("%u6D4B%u8BD5%u6837%u4F8B"));
            }
        });
    }
}

混淆配置

参考资料

 java模拟js的escape和unescape函数

Java中的escape,unescape方法

项目demo下载地址

暂时空缺

posted @ 2018-07-28 21:58  HaiyuKing  阅读(864)  评论(0编辑  收藏  举报