key words: 腳本編碼 中文亂碼 js
在jsp中,通過js訪問java代碼比較容易(不過,也有缺陷,比如java代碼的聲明必須先于js),反過來則不方便,網上看到有通過其他組件的方式來做,感覺也不是很好,其實平時用的更多的是在js中有中文編碼,而需要到下一個jsp頁面中得到這個對應的值。
js中有函數escape和unescape,可惜的是java.net.*中的編碼和解碼與js的不一致,所以他們不能協同工作,有一個方法就是在java中重新實現一遍js里對應的方法,代碼如下:
在jsp中,通過js訪問java代碼比較容易(不過,也有缺陷,比如java代碼的聲明必須先于js),反過來則不方便,網上看到有通過其他組件的方式來做,感覺也不是很好,其實平時用的更多的是在js中有中文編碼,而需要到下一個jsp頁面中得到這個對應的值。
js中有函數escape和unescape,可惜的是java.net.*中的編碼和解碼與js的不一致,所以他們不能協同工作,有一個方法就是在java中重新實現一遍js里對應的方法,代碼如下:
/**
?*?java版本的escape和?unescape[對應javaScript里的函數]
?*/
public?class?EscapeUnescape?{
????/**
?????*?escape?==>?escape
?????*?@param?src
?????*?@return?String
?????*/
????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();
????}
????/**
?????*?unescape?===>js
?????*?@param?src
?????*?@return?String
?????*/
????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();
????}
}
?*?java版本的escape和?unescape[對應javaScript里的函數]
?*/
public?class?EscapeUnescape?{
????/**
?????*?escape?==>?escape
?????*?@param?src
?????*?@return?String
?????*/
????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();
????}
????/**
?????*?unescape?===>js
?????*?@param?src
?????*?@return?String
?????*/
????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();
????}
}