【開發筆記】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實現JS中的escape()和unescape()
在做建行支付對接時,傳的引數中的漢字,需要用escape()編碼 但我是通過Java和.Net後臺直接請求,因此需要在後臺實現類似的功能 所以在此貼上程式碼 Java /** * 漢字編碼,實現js escape() * * @p
【開發筆記】Unity聯網鬥地主的實現(一,伺服器與客戶端的資料傳遞流程)
話不多說,先上我李老師的思維導圖 大致構思了一個框架 1.首先要定義一下伺服器與客戶端的傳輸協議,必須保持一致 2.定義服務於客戶端傳輸的訊息型別,如(申請加入,同意加入,出牌,之類的) 3.定義一下牌的型別,出的牌的型別,在客戶端判斷是否可以出牌,牌型傳給伺服器,伺服器在完成三個玩家的出
【學習筆記】JAVA中replace和replaceAll的區別
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 錯誤地使用執行緒可能會產生許多不同型別的問題。太多活動執行緒可能導致執行緒不足,執行緒可能會相互阻塞並