1. 程式人生 > >【開發筆記】Java和.Net實現JS中的escape()和unescape()

【開發筆記】Java和.Net實現JS中的escape()和unescape()

在做建行支付對接時,傳的引數中的漢字,需要用escape()編碼

但我是通過Java和.Net後臺直接請求,因此需要在後臺實現類似的功能

所以在此貼上程式碼

Java

    /**
     * 漢字編碼,實現js escape()
     *
     * @param src
     * @return
     */
    public static String escape(String src) {
        int i;
        char j;
        StringBuffer tmp = new StringBuffer();
        tmp.ensureCapacity(src.length() * 6);
        for (i = 0; i < src.length(); i++) {
            j = src.charAt(i);
            if (Character.isDigit(j) || Character.isLowerCase(j)
                    || Character.isUpperCase(j))
                tmp.append(j);
            else if (j < 256) {
                tmp.append("%");
                if (j < 16)
                    tmp.append("0");
                tmp.append(Integer.toString(j, 16));
            } else {
                tmp.append("%u");
                tmp.append(Integer.toString(j, 16));
            }
        }
        return tmp.toString();
    }

    /**
     * 漢字解碼 實現js unescap()
     *
     * @param src
     * @return
     */
    public static String unescape(String src) {
        StringBuffer tmp = new StringBuffer();
        tmp.ensureCapacity(src.length());
        int lastPos = 0, pos = 0;
        char ch;
        while (lastPos < src.length()) {
            pos = src.indexOf("%", lastPos);
            if (pos == lastPos) {
                if (src.charAt(pos + 1) == 'u') {
                    ch = (char) Integer.parseInt(src
                            .substring(pos + 2, pos + 6), 16);
                    tmp.append(ch);
                    lastPos = pos + 6;
                } else {
                    ch = (char) Integer.parseInt(src
                            .substring(pos + 1, pos + 3), 16);
                    tmp.append(ch);
                    lastPos = pos + 3;
                }
            } else {
                if (pos == -1) {
                    tmp.append(src.substring(lastPos));
                    lastPos = src.length();
                } else {
                    tmp.append(src.substring(lastPos, pos));
                    lastPos = pos;
                }
            }
        }
        return tmp.toString();
    }

.Net

        /// <summary>
        /// escape加密
        /// </summary>
        /// <returns></returns>
        public string Escape(string s)
        {
            StringBuilder sb = new StringBuilder();
            byte[] byteArr = System.Text.Encoding.Unicode.GetBytes(s);

            for (int i = 0; i < byteArr.Length; i += 2)
            {
                sb.Append("%u");
                sb.Append(byteArr[i + 1].ToString("X2"));//把位元組轉換為十六進位制的字串表現形式

                sb.Append(byteArr[i].ToString("X2"));
            }
            return sb.ToString();
        }

        /// <summary>
        /// unescape解密
        /// </summary>
        /// <returns></returns>
        private string unescape(string s)
        {

            string str = s.Remove(0, 2);//刪除最前面兩個"%u"
            string[] strArr = str.Split(new string[] { "%u" }, StringSplitOptions.None);//以子字串"%u"分隔
            byte[] byteArr = new byte[strArr.Length * 2];
            for (int i = 0, j = 0; i < strArr.Length; i++, j += 2)
            {
                byteArr[j + 1] = Convert.ToByte(strArr[i].Substring(0, 2), 16);  //把十六進位制形式的字串符串轉換為二進位制位元組
                byteArr[j] = Convert.ToByte(strArr[i].Substring(2, 2), 16);
            }
            str = System.Text.Encoding.Unicode.GetString(byteArr); //把位元組轉為unicode編碼
            return str;

        }

相關推薦

開發筆記Java.Net實現JSescape()unescape()

在做建行支付對接時,傳的引數中的漢字,需要用escape()編碼 但我是通過Java和.Net後臺直接請求,因此需要在後臺實現類似的功能 所以在此貼上程式碼 Java /** * 漢字編碼,實現js escape() * * @p

開發筆記Unity聯網鬥地主的實現(一,伺服器與客戶端的資料傳遞流程)

話不多說,先上我李老師的思維導圖 大致構思了一個框架 1.首先要定義一下伺服器與客戶端的傳輸協議,必須保持一致 2.定義服務於客戶端傳輸的訊息型別,如(申請加入,同意加入,出牌,之類的) 3.定義一下牌的型別,出的牌的型別,在客戶端判斷是否可以出牌,牌型傳給伺服器,伺服器在完成三個玩家的出

學習筆記JAVAreplacereplaceAll的區別

replaceAll()&&replace區別: 1、replaceA(regex,replace)引數是regex,是基於正則表示式的替換; 2、replace(oldChar, newChar)可以支援字元的替換,也可以支援字串的替換; PS

開發筆記茶餘飯後:2、Java問題排查(壓力測試效能監控)

       Java效能問題監控排查,主要就是對Java執行緒的堆疊進行分析,這就用到了Thread Dump工具,就是打印出Java應用執行時的堆疊資訊來定位執行步驟中出現的問題。 【記壓力測試關閉其他因素:1、修改java應用的日誌等級;2、必要

開發筆記基於EasyUI框架,實現table列的動態繫結

使用easyUI從後臺獲取欄位,前臺動態繫結 如下圖效果,表頭小區動態載入,如果沒有賣出商品,就不顯示,並且表頭下方分欄顯示 後臺使用c#,Java程式碼也可以參考 不多說,直接上程式碼 html <table id="PayReport" class="

開發筆記 .Net平臺下log4Net日誌的使用

使用Nuget下載即可 log4Net可以將日誌根據業務放進不同資料夾,同時也可以根據時間維度生成本地日誌檔案 第一步:web.config配置   <configSections>   

學習筆記Java生成對象的5方法

目標 獲得 cti com pre lan except 我們 highlight 概述:本文介紹以下java五種創建對象的方式: 1.用new語句創建對象,這是最常用的創建對象的方式。 2.使用Class類的newInstance方法 3.運用反射手段,調用java.la

學習筆記四:變量、作用域內存問題

允許 幫助 範圍 訪問內存 常用 ie9 值傳遞 問題: eof 1.引用類型的值   引用類型的值是指保存在內存中的對象,JavaScript不允許直接訪問內存中的位置,因此在操作對象時,實際上是操作的引用而不是實際的對象。(嚴密的說法是:當復制保存著對象的某個變量時,

程式設計筆記執行緒池實現原始碼(從POCO剝離出來)

原始碼下載:https://download.csdn.net/download/fzuim/10625204 CThreadPool類 /***************************************************************

學習筆記Java-Concurrent-多執行緒容器

BlockingQueue 阻塞佇列 高頻函式:   boolean put() 新增一個元素 沒有空間則一直阻塞等待   boolean add() 新增一個元素 沒有空間則丟擲IllegalStateException異常   boolean off

學習筆記Java-Concurrent-多執行緒測試模板

import java.util.concurrent.CountDownLatch; /** * 多執行緒測試模板 * * @author Mairuis * @date 2018/10/11 */ public class ConcurrentTest { public s

學習筆記Java-Concurrent-Semaphore

  同時只有一個人可以吃麵包的示例 /** * 第一個執行緒 與第二個同時執行 */ public static void firstThread0(Context context) throws Exception{ while

工作筆記Java使用POI輸出圖片

最近接到需求,將一些資料資訊錄入到Excel中,與以往不同的是,每條資訊中有圖片。搜尋了POI相關,完成了此需求。 private HSSFWorkbook generateSnsPics(String gid, List<TerminalDailyData>

開發筆記搭建KVM虛擬化系統的筆記

KVM簡介 KVM的優勢:核心小(意味著資源佔用少)、基於硬體的完全虛擬化、開源(無License限制)、基本不受制於Linux系統版本。 與Docker的區別:KVM是主機虛擬化、Docker是程

開發筆記swift語法小記

最近在開發一個swift專案,swift語法說真的有點怪,不像js抓過來就寫。開一篇文章記錄swift與眾不懂的語法。 swift中檔案的匯入 swift中只要用swift寫的類都不需要額外的import,但是使用OC中寫的庫的時候需要import guard關鍵字

JDBC程式設計Java 連線 MySQL資料庫基礎、入門進階

Content: 常用的JDBC API 資料庫環境的搭建 建立資料庫連線 資料庫訪問優化 一. 常用的JDBC API 1. DriverManager類 : 資料庫管理類,用於管理一組JDBC驅動程式的基本服務。應用程式和資料

讀書筆記Java 工程師修煉之道

日期:2018年10月19日 13:09 地點:玉泉慧谷 圖書:《Java 工程師修煉之道》2018年3月出版 一、記錄 前天晚上睡前無聊,在多看app裡搜了下 Java 相關的電子書。有 3 本成功吸引了我的注意力,其中一本就是上面提到的這個。看到的時候,已經很

vggface2人臉識別資料集 論文筆記VGGFace2——一個能夠用於識別不同姿態年齡人臉的資料集

原 【論文筆記】VGGFace2——一個能夠用於識別不同姿態和年齡人臉的資料集 2018年01月10日 14:53:31 有來有去-CV 閱讀數:6701

開發筆記使用easyUI DataGrid繫結本地資料,併合並列相同行的欄位

看標題有點繞,好吧,那就先上結果圖 這就是最終的結果圖,那我們一步一步來 先實現繫結資料 HTLM <table id="WJDCReport" class="easyui-datagrid" style="width:auto;" toolbar="#to

開發工具JAVA效能分析:8、超詳細的JProfiler執行緒分析(官方中文版)

Thread Profiling——執行緒分析 官方文件http://resources.ej-technologies.com/jprofiler/help/doc/index.html 錯誤地使用執行緒可能會產生許多不同型別的問題。太多活動執行緒可能導致執行緒不足,執行緒可能會相互阻塞並