第一、字符串内存理解
1、容量大小计算 1byte=8bit 1k=1024byte 1m=1024k 1g=1024m 1t=1024g
2、java字符串中使用getByte()获取字符串的字节(byte)数量,即存储空间大小。
3、英文字母(a-z获取A-Z)一个字母占一个字节,即1024个字母=1k
4、英文下的符号(~!@#¥%……&*())等等一个占一个字节,即1024个符号=1k
5、中文汉字一个汉字占用的字节数和中文汉字的编码直接关联,常用编码字节数如下:
GBK,GB2312,GB18030编码的汉字一个汉字占用2个字节,即512个汉字=1k
UTF-8编码的汉字一个汉字占用3个字节,即341个汉字=1k
UTF-16编码的汉字一个汉字占用4个字节,即256个汉字=1k
6、中文字符占用字节和中文汉字相同。
第二、js加密解密与java后端解密对应方法
1、测试代码
var ni="{name:\"wos\",age:12}";
var tmp=escape(ni);
console.log(tmp);
console.log(unescape(tmp));
var tmp2=encodeURI(ni);
console.log(tmp2);
console.log(decodeURI(tmp2));
var tmp3=encodeURIComponent(ni);
console.log(tmp3);
console.log(decodeURIComponent(tmp3));
一、encodeURI() 函数可把字符串作为 URI 进行编码。
语法
encodeURI(URIstring)
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
此方法的解码为decodeURI()
1)encodeURI和URLEncoder.encode的区别在于前者对下面五个符号不编码
! %21 ' %27 ( %28 ) %29 ~ %7E
2)前后台交互传输数据的过程中,如果含有!'()~,同样的内容会传输不同的编码结果
java
URLDecoder.decode(value, "utf-8"); decodeURI(value): 将utf-8的value反转成字符串。
二、escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。
提示:可以使用 unescape() 对 escape() 编码的字符串进行解码。
注释:ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。
//Java 后台 js escape后的 unescape 解密方法
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();
}
//js java 对应的 escape编码方法
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();
}
三、JavaScript encodeURIComponent() 函数
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
encodeURIComponent(URIstring)
URIstring 必需。一个字符串,含有 URI 组件或其他要编码的文本。
URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
解密方法 decodeURIComponent
Java
java.net.URLDecoder.encode("df","UTF-8"); encodeURIComponent
java.net.URLDecoder.decode(tmp, "utf-8") decodeURIComponent
1)encodeURIComponent和URLEncoder.encode的区别在于前者对下面五个符号不编码
! %21 ' %27 ( %28 ) %29 ~ %7E
2)前后台交互传输数据的过程中,如果含有!'()~,同样的内容会传输不同的编码结果
encodeURIComponent编码后java后台的解码
解决方法一:
JavaScript:
window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext));
Java:
searchtext=java.NET.URLDecoder.decode(searchtext,"UTF-8");
为什么要两次编码的原因:后台java代码给searchtext赋值的时候,本身已经使用了一次解码,不过解码的结果依然不对。所以我们可以在页面上进行两次编码操作,这样后台自动的那次就可以抵消掉一次,然后在使用searchtext=java.Net.URLDecoder.decode(searchtext,"UTF-8");进行一次解码就好了。