Java中正确解码
- 格式:doc
- 大小:52.50 KB
- 文档页数:7
java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。
其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。
一种常见的密码加密方法是使用MessageDigest类进行加密。
这可以通过以下步骤实现:首先,将密码转换为字节数组。
然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。
接下来,使用update方法将密码的字节数组传递给MessageDigest实例。
最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。
另一种常见的方法是使用对称加密算法,例如AES或DES。
这些算法使用相同的密钥进行加密和解密。
在Java中,可以使用javax.crypto包中的类来实现对称加密。
通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。
此外,还可以使用非对称加密算法,例如RSA。
这种方法使用公钥对数据进行加密,然后使用私钥进行解密。
在Java中,可以使用java.security包中的类来实现非对称加密。
无论使用哪种方法,都需要注意密码安全的问题。
例如,密钥的安全存储和管理,以及密码传输过程中的安全性。
另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。
总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。
希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。
java中的url编码与解码在开始讨论编码解码之前,⾸先来明确⼀下问题。
什么是application/x-www-form-urlencoded字符串?答:它是⼀种编码类型。
当URL地址⾥包含⾮西欧字符的字符串时,系统会将这些字符转换成application/x-www-form-urlencoded字符串。
表单⾥提交时也是如此,当包含⾮西欧字符的字符串时,系统也会将这些字符转换成application/x-www-form-urlencoded字符串。
然⽽,在向服务器发送⼤量的⽂本、包含⾮ASCII字符的⽂本或⼆进制数据时这种编码⽅式效率很低。
这个时候我们就要使⽤另⼀种编码类型“multipart/form-data”,⽐如在我们在做上传的时候,表单的enctype属性⼀般会设置成“multipart/form-data”。
Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要⽤到传输,由于多媒体传输的都是⼤量的数据,所以规定上传⽂件必须是post⽅法,<input>的type属性必须是file。
form中的其他enctype请。
跑题了我。
我们经常会在浏览器的地址栏⾥看到这样的字符串%E6%96%87%E6%A1%A3这就是被编码后的字符串,下⾯我们就讨论⼀下java 的url编码与解码问题代码.URLDecoder.decode(String s,String enc);将application/x-www-form-urlencoded字符串转换成普通字符串。
.URLEncoder.decode(String s,String enc);将普通字符串转换成application/x-www-form-urlencoded字符串代码下⾯转载⼀⽚⽂章/*⽹页中的表单使⽤POST⽅法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会:1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;2.将空格转换为加号 (+) ;3.将⾮⽂本内容转换成"%xy"的形式,xy是两位16进制的数值;4.在每个 name=value 对之间放置 & 符号。
java霍夫曼编码及解码霍夫曼编码是一种用于数据压缩的技术,它基于一种被称为霍夫曼树的二叉树结构。
下面是一个简单的Java 实现示例,包括霍夫曼编码和解码。
```javaimport java.util.HashMap;import java.util.Map;import java.util.PriorityQueue;class HuffmanNode implements Comparable<HuffmanNode> {char data;int frequency;HuffmanNode left, right;public HuffmanNode(char data, int frequency) {this.data = data;this.frequency = frequency;}@Overridepublic int compareTo(HuffmanNode o) {return this.frequency - o.frequency;}}public class HuffmanCoding {public static void main(String[] args) {String input = "hello world";Map<Character, Integer> frequencyMap = buildFrequencyMap(input);HuffmanNode root = buildHuffmanTree(frequencyMap);Map<Character, String> huffmanCodes = buildHuffmanCodes(root);String encoded = encode(input, huffmanCodes);System.out.println("Encoded: " + encoded);String decoded = decode(encoded, root);System.out.println("Decoded: " + decoded);}private static Map<Character, Integer> buildFrequencyMap(String input) {Map<Character, Integer> frequencyMap = new HashMap<>();for (char c : input.toCharArray()) {frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);}return frequencyMap;}private static HuffmanNode buildHuffmanTree(Map<Character, Integer> frequencyMap) { PriorityQueue<HuffmanNode> priorityQueue = new PriorityQueue<>();for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {priorityQueue.add(new HuffmanNode(entry.getKey(), entry.getValue()));}while (priorityQueue.size() > 1) {HuffmanNode left = priorityQueue.poll();HuffmanNode right = priorityQueue.poll();HuffmanNode internalNode = new HuffmanNode('\0', left.frequency + right.frequency);internalNode.left = left;internalNode.right = right;priorityQueue.add(internalNode);}return priorityQueue.poll();}private static Map<Character, String> buildHuffmanCodes(HuffmanNode root) { Map<Character, String> huffmanCodes = new HashMap<>();buildCodesRecursive(root, "", huffmanCodes);return huffmanCodes;}private static void buildCodesRecursive(HuffmanNode node, String code, Map<Character, String> huffmanCodes) {if (node == null) {return;}if (node.data != '\0') {huffmanCodes.put(node.data, code);}buildCodesRecursive(node.left, code + "0", huffmanCodes);buildCodesRecursive(node.right, code + "1", huffmanCodes);}private static String encode(String input, Map<Character, String> huffmanCodes) { StringBuilder encoded = new StringBuilder();for (char c : input.toCharArray()) {encoded.append(huffmanCodes.get(c));}return encoded.toString();}private static String decode(String encoded, HuffmanNode root) {StringBuilder decoded = new StringBuilder();HuffmanNode current = root;for (char bit : encoded.toCharArray()) {if (bit == '0') {current = current.left;} else if (bit == '1') {current = current.right;}if (current.data != '\0') {decoded.append(current.data);current = root;}}return decoded.toString();}}```这个简单的示例演示了如何使用霍夫曼编码对字符串进行编码和解码。
javaBase64编码、解码⽬录并⾮所有数据都可以⽤String类型来显⽰(例如字节流数据),但是都可以转为byte数组后进⾏base64编码再转String来显⽰,使⽤的时候再解码成原数据即可。
jdk8提供了Base64的⽀持、使⽤⾮常简单。
只需区分开encode与decode即可。
encode:编码,可以将任意数据进⾏base64编码//byte数组进⾏编码byte[] bytes = new byte[1024];byte[] encode = Base64.getEncoder().encode(bytes);decode:解码,⽤户将进⾏了base64编码的数据还原//编码结果进⾏Base64解码,解码得到的byte数组即为编码源数组byte[] encode = Base64.getDecoder().decode(encode);所有对象类型⽀持Base64编码解码。
java所有对象都是继承了Object的,请看以下代码。
可以确定java的所有对象类型皆可采⽤base64编码后传输,解码获取。
//Base64解码为String类型String str1 = new String(Base64.getDecoder().decode(encode2));System.out.println("原⽂原⽂⽂"+msg1);System.out.println("编码解码后"+str1);//获取 Long 类型Base64编码Object oldObject = new Long("12354687");ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);objectOutputStream.writeObject(oldObject);//原对象字节数组byte[] bytes = outputStream.toByteArray();//编码后字节数组byte[] encode3 = Base64.getEncoder().encode(bytes);//解码后字节数组byte[] decode1 = Base64.getDecoder().decode(encode3);//此处可以通过循环判定内容是否变更,由于字节数组内容完全相等,所以”不想等“字符串永不打印if(bytes.length==decode1.length){for (int i = 0; i < decode1.length; i++) {if(bytes[i]!=decode1[i]){System.out.println("不相等");}}}ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decode1);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);Object newObject = objectInputStream.readObject();System.out.println("新旧对象是否相等:"+newObject.equals(oldObject));。
Java实现Base64编解码为什么要⽤Base64编码在⽹络中传输数据都是使⽤ascii⽅式传输。
对于⼀些图⽚、视频等数据,可能就会被编码成ascii中不可见部分的编码。
⽹络中不同的路由设备处理⽅式不同,有可能就会把这部分数据弄丢了。
为了保证数据传输的正确性,可以使⽤Base64编码将这些不可见数据编码成可见数据。
Java实现Base64编解码的⼏种⽅法⽅法⼀使⽤sun.misc包中的BASE64Encoder和BASE64Decoder类进⾏编解码。
这种⽅式⽐较古⽼,不推荐使⽤。
代码如下:/*** sun.misc⽅式Base64编码* @param str* @return*/public static String encodeBySunMisc(String str) {try {return new BASE64Encoder().encode(str.getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();return "";}}/*** sun.misc⽅式Base64解码* @param str* @return*/public static String decodeBySunMisc(String str) {try {byte[] result = new BASE64Decoder().decodeBuffer(str);return new String(result);} catch (IOException e) {e.printStackTrace();return "";}}sun.misc的Base64⼯具虽然在jdk中,但是并不属于标准库,所以在Eclipse中⽆法直接使⽤。
可以通过⼿动引⼊⽅式使⽤。
一、EncodeURI和Java解码的概念在编程中,EncodeURI是指对URI(Uniform Resource Identifier,统一资源标识符)进行编码,以便能在网络环境下传输。
而Java解码则是指使用Java编程语言对经过编码的URI进行解码,以还原原始的信息内容。
二、EncodeURI的作用和原理1. 作用:EncodeURI主要用于对URI中的非安全字符进行编码,以确保URI能够在网络环境下被正确传输和解析。
非安全字符包括某些特殊符号和中文等字符。
2. 原理:EncodeURI使用一种称为百分号编码(Percent-encoding)的方式对URI进行编码。
百分号编码是通过将每个字符转换成其在ASCII字符集中的十六进制值,并在前面加上百分号来表示。
这样就可以确保URI中不会含有非安全字符,从而避免出现传输和解析问题。
三、Java解码的实现方式1. Java提供了一些内置的工具类和方法,可以用于对经过编码的URI进行解码。
其中比较常用的是包中的URLDecoder类,它提供了decode()方法来实现解码功能。
2. 通过调用URLDecoder类的decode()方法,可以将经过编码的URI字符串还原成原始的URI内容。
解码完成后,就可以对URI进行进一步处理和分析。
四、EncodeURI和Java解码的应用场景1. 在Web开发中,EncodeURI和Java解码经常用于处理URL参数传递的情况。
比如在前端页面中使用JavaScript的encodeURIComponent()方法对参数进行编码,然后在后端使用Java 的URLDecoder类对参数进行解码,以确保参数的准确传递和处理。
2. 在网络通信中,EncodeURI和Java解码也可以用于对URL进行编码和解码,以确保URL在不同环境下的正确传输和解析。
五、总结在编程开发中,对URI进行编码和解码是非常常见的操作。
EncodeURI和Java解码是两种常用的方式,能够确保URI在网络环境下的传输和解析准确无误。
java 字符串加密解密常见方法在Java中,我们经常需要对字符串进行加密和解密操作以确保数据的安全性。
下面我将介绍一些常见的字符串加密和解密方法。
1. 使用Base64编码:Base64是一种常用的编码方式,它可以将任意二进制数据编码为纯文本字符串。
在Java中,可以借助Java提供的Base64类对字符串进行加密和解密操作。
例如:```javaimport java.util.Base64;public class Base64Util {// 字符串加密public static String encrypt(String str) {byte[] bytes = str.getBytes();byte[] encodedBytes = Base64.getEncoder().encode(bytes);return new String(encodedBytes);}// 字符串解密public static String decrypt(String str) {byte[] bytes = str.getBytes();byte[] decodedBytes = Base64.getDecoder().decode(bytes);return new String(decodedBytes);}}```2. 使用AES算法:AES(Advanced Encryption Standard)是一种对称加密算法,它可以对数据进行加密和解密。
在Java中,可以使用javax.crypto包提供的类来实现AES加密和解密。
例如:```javaimport javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESUtil {// 生成AES密钥private static SecretKeySpec generateKey(String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] encodedKey = secretKey.getEncoded();return new SecretKeySpec(encodedKey, "AES");}// 字符串加密public static String encrypt(String str, String key) throws Exception {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));byte[] encryptedBytes = cipher.doFinal(str.getBytes());return new String(encryptedBytes);}// 字符串解密public static String decrypt(String str, String key) throws Exception {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, generateKey(key));byte[] decryptedBytes = cipher.doFinal(str.getBytes());return new String(decryptedBytes);}}```这是两种常见的字符串加密和解密方法。
Java中的字节,字符与编码,解码ASCII编码ASCII码主要是为了表⽰英⽂字符⽽设计的,ASCII码⼀共规定了128个字符的编码(0x00-0x7F),只占⽤了⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。
ISO-8859-1编码为了扩展覆盖其他语⾔字符,ISO组织在ASCII码基础上⼜制定了⼀系列标准⽤来扩展ASCII编码,它们是ISO-8859-1~ISO-8859-15,其中ISO-8859-1应⽤得最⼴泛。
ISO-8859-1仍然是单字节编码,它总共能表⽰256个字符。
ISO-8859-1向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII⼀致。
因为ISO-8859-1编码范围使⽤了单字节内的所有空间,在⽀持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。
换⾔之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。
Unicode,UCS2和UCS4Unicode是为整合全世界的所有语⾔⽂字⽽诞⽣的。
任何⽂字在Unicode中都对应⼀个值,这个值称为代码点(Code Point),常写成 U+XXXX的格式。
⽽⽂字和代码点之间的对应关系就有UCS-2和UCS-4。
UCS-2:⽤两个字节来表⽰代码点,其取值范围为 U+0000~U+FFFF。
UCS-4:为了能表⽰更多的⽂字,⼈们⼜提出了UCS-4,即⽤四个字节表⽰代码点。
它的范围为 U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF和UCS-2是⼀样的。
要注意,UCS-2和UCS-4只规定了代码点和⽂字之间的对应关系,并没有规定代码点在计算机中如何存储。
规定存储⽅式的称为UTF(Unicode Transformation Format),其中应⽤较多的就是UTF-8和UTF-16了。
UTF-8,UTF-16,UTF-32UTF-32是对应于UCS-4,不常⽤。
javabase64编码、解码的三种⽅式总结1.⽤法介绍⽅式⼀:DatatypeConverter 说明:使⽤jdk⾃带的DatatypeConverter.java类实现,但是jdk版本必须>=1.6。
import java.io.UnsupportedEncodingException;import javax.xml.bind.DatatypeConverter; 编码/*** base64编码之⽅法⼀* @explain DatatypeConverter.java实现* @param str* 待编码字符串* @return 编码字符串*/public static String encode(String str) {// base64字符串String base64Str = "";try {// String-->byte[]byte[] data = str.getBytes("utf-8");// 编码base64Str = DatatypeConverter.printBase64Binary(data);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return base64Str;} 解码/*** base64解码之⽅法⼀* @explain DatatypeConverter.java实现* @param base64Str* 待解码字符串* @return 解码字符串*/public static String decode(String base64Str) {// 解码后的字符串String str = "";// 解码byte[] base64Data = DatatypeConverter.parseBase64Binary(base64Str);try {// byte[]-->Stringstr = new String(base64Data, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return str;} ⽅式⼆:Base64 说明:使⽤jdk⾃带的Base64.java类实现,但是jdk版本必须>=1.8。
Java密码加密解密方法一、引言在计算机系统中,信息安全是至关重要的一环。
其中,密码加密和解密是最常见的安全措施之一。
Java作为一种广泛使用的编程语言,提供了丰富的加密解密方法和库。
Java中的密码加密解密方法介绍如下。
二、Java加密解密基础在Java中,加密和解密是通过密钥进行的。
加密是将明文(原始数据)转换为密文(难以理解的数据),而解密则是将密文转换回明文。
这两个过程都需要使用到密钥。
Java提供了两种主要的加密技术:对称加密和非对称加密。
对称加密是指加密和解密使用同一个密钥,而非对称加密则是指加密和解密使用不同的密钥。
三、Java对称加密解密方法1. Java内置的加密解密方法:Java提供了一套内置的加密解密方法,主要包括MessageDigest、Cipher等类。
2. Java加密体系:Java加密体系主要包括JCE(Java Cryptography Extension)和JKS(Java KeyStore)。
JCE提供了一系列的加密算法,如AES、DES、RSA等。
JKS 则是用来存储密钥和证书的。
3. 对称加密的示例代码:以下是一个简单的对称加密解密的示例代码。
import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;public class Main {public static void main(String[] args) throws Exception {String key = "1234567890123456"; // 密钥String data = "Hello, World!"; // 要加密的数据// 创建密钥SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");// 创建并初始化Cipher对象Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 加密数据byte[] encryptedData = cipher.doFinal(data.getBytes());System.out.println("Encrypted data: " + new String(encryptedData));// 创建并初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, secretKey);// 解密数据byte[] decryptedData = cipher.doFinal(encryptedData);System.out.println("Decrypted data: " + new String(decryptedData));}}四、Java非对称加密解密方法1. Java内置的非对称加密解密方法:Java提供了一套内置的非对称加密解密方法,主要包括KeyPairGenerator、KeyPair、Cipher等类。
Java中正确解码用Javascript:escape()编码的中文字符做页面开发时使用了Javascript 的escape()函数进行URL编码,如果url中有中文,结果在JSP或Servlet 中用request.getParameter()时取不到参数,只返回一个空值。
经过Baidu的搜索,结合我自己的工作实际,再加上网友的一些帮助,终于找到了问题所在及解决的办法。
本来Javascript 中的escape()是将中文按ISO-8859-1字符集进行URL编码的,那样通过request.getParameter()是能直接获取到请求参数的,但后来的Javascript将escape()换成了Unicode字符集编码,如此一来,在JSP和Servlet中就没法直接拿到请求参数了,而且此时的request获得的参数值都是空值,想了好久,也测试了不少,但是还是百思不得其解。
最后借助于网络,终于解决了此问题,我露出了灿烂的笑容?解决办法:1、首先对中文字符进行两次escape()编码,如要传参数name,值为“黄修群”,则url的格式为=escape(escape("黄修群")),这样一来,在request.getParameter()就能取到编码后的参数了,但是参数去编码的形式:如下:%u9EC4%u4FEE%u7FA4,获得的页面参数为:获取request参数值-->%u9EC4%u4FEE%u7FA4此时在使用.URIDecoder.decode()方法,则出现解码错误,错误信息如下:2010-5-19 15:28:03 org.apache.catalina.core.ApplicationDispatcher invoke严重: Servlet.service() for servlet jsp threw exceptionng.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9"at .URLDecoder.decode(URLDecoder.java:173)at com.mapgis.vfd.plugins.vfdwebserver.VFDWebServer.getPageParameterList(VFDWebServer.java:674) 可见是解码出现了问题了也许有人问,那我在客户端非要只用一次escape方法编码,会出现什么样的结果?请看下面:2010-5-19 14:59:38 org.apache.tomcat.util.http.Parameters processParameters警告: Parameters: Character decoding failed. Parameter skipped.java.io.CharConversionException: isHexDigitat org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:88)at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:49)at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:412)at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:394)。
看到上面的提示信息,可以断定是解码出现问题了,而获得的请求对象去是空的,如下:获取request参数值-->null2、由于取到的参数是u9EC4%u4FEE%u7FA4格式的,没法用常规的URLDecoder.decode()来进行解码,还好,这世上的牛人够多,在网上直接找到了一个工具类,能实现Javascript中escape()及unescape()式的编解码,源代码如下:[java]/*** JavaScript escape/unescape 编码的Java 实现* author jackyz* keep this copyright info while using this method by free*/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 };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 %uXXXXsbuf.append('%');sbuf.append('u');sbuf.append(hex[(ch >>> 8)]);sbuf.append(hex[(0x00FF & ch)]);}}return sbuf.toString();}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) | val[s.charAt(i+1)];cint = (cint << 4) | val[s.charAt(i+2)];i+=2;} else { // %uXXXX : map to unicode(XXXX)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);}i++;}return sbuf.toString();}public static void main(String[] args) {String stest = "黄修群1234 abcd[]()<+>,.~//";System.out.println(stest);System.out.println(escape(stest));System.out.println(unescape(escape(stest)));}}[java]/*** JavaScript escape/unescape 编码的Java 实现* author jackyz* keep this copyright info while using this method by free*/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 };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 wassbuf.append((char)ch);} else if ('a' <= ch && ch <= 'z') { // 'a'..'z' : as it wassbuf.append((char)ch);} else if ('0' <= ch && ch <= '9') { // '0'..'9' : as it wassbuf.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 %uXXXXsbuf.append('%');sbuf.append('u');sbuf.append(hex[(ch >>> 8)]);sbuf.append(hex[(0x00FF & ch)]);}}return sbuf.toString();}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) | val[s.charAt(i+1)];cint = (cint << 4) | val[s.charAt(i+2)];i+=2;} else { // %uXXXX : map to unicode(XXXX)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);}i++;}return sbuf.toString();}public static void main(String[] args) {String stest = "黄修群1234 abcd[]()<+>,.~//";System.out.println(stest);System.out.println(escape(stest));System.out.println(unescape(escape(stest)));}}代码运行如下:黄修群1234 abcd[]()<+>,.~/%u9EC4%u4FEE%u7FA41234+abcd%5B%5D()%3C%2B%3E%2C.~%5C黄修群1234 abcd[]()<+>,.~/黄修群有了这个工具类,直接用Escape.unescape()方法就能将获取到的参数解码成中文格式了。