背景:
在研究“开发API接口的安全验证:token,参数签名,时间戳”中的签名的过程中,涉及到了
字符编码::
URLEncoder.encode(SecurityUtil.EncryptByRSAPriKey(summary, SecurityUtil.getPrivateKey()), "utf-8");
说明:其中的summary 是相当于age=18&name=yushanma这种参数进行RSA或者MD5加密后并转换大写之后的一个加密的参数字符串;
字符解码:
URLDecoder.decode(sign, "utf-8")
说明:sign是进行加密后,在进行上面的encode编码的一个参数字符串。
解释:
URLDecoder.decode(String s, String enc) 是 Java 中的一个方法,用于将经过“URL
编码【URLDecoder.encode(String s, String enc) 】”的字符串 s
解码成原始字符串,同时指定了解码时使用的字符集编码方式
enc【一般指定成UTF-8】。在这个例子中,URLDecoder.decode(sign, “utf-8”) 的作用是将名为 sign
的字符串(假设它包含了经过 URL 编码的字符)按照 UTF-8 字符集进行解码,返回解码后的原始字符串。
URL 编码
URL 编码(也称为百分比编码)是一种用于在统一资源标识符(URI)中表示保留字符和非ASCII字符的机制。在 URL 中,一些字符是保留的,具有特殊的含义(如空格、?、=、& 等),这些字符不能直接用在 URL 中,而需要通过百分比符号(%)后跟两位十六进制数来编码。 此外,非ASCII字符(如中文字符)也需要进行编码,以确保它们可以在 URL 中安全传输。
java中URL 的编码和解码函数 :
java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);
在javascript 中URL 的编码和解码函数 :
escape(String s)和unescape(String s);
编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
解码效果
解码过程是将这些经过编码的字符转换回它们原始的、未编码的形式。例如:
如果 sign 是 %E4%BD%A0%E5%A5%BD,这是一个经过 URL 编码的字符串,代表中文字符“你好”。 使用
URLDecoder.decode(sign, “utf-8”) 进行解码后,会得到字符串 “你好”。
注意事项
- 解码时指定的字符集(在这个例子中是 “utf-8”)必须与原始字符串编码时使用的字符集相匹配,否则可能会导致乱码。
- 如果 sign 字符串中不包含任何需要解码的百分比编码字符,那么解码操作将简单地返回原始字符串。
- URLDecoder 只会解码百分比编码的字符,而不会处理其他形式的编码(如 Base64 编码)。
示例
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class URLDecoderExample {
public static void main(String[] args) {
try {
String encodedSign = "%E4%BD%A0%E5%A5%BD"; // 经过URL编码的“你好”
String decodedSign = URLDecoder.decode(encodedSign, "utf-8");
System.out.println(decodedSign); // 输出:你好
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}