js編碼處理

1.使用JS中的encodeURIComponent或encodeURI方法。

說明:

encodeURIComponent(String)

對(duì)傳遞參數(shù)進(jìn)行設(shè)置。不編碼字符有71個(gè):!,',(,),*,-,.,_,~,0-9,a-z,A-Z。

例:

var url = “中國(guó)”;

encodeURI(String)

對(duì)URL整體轉(zhuǎn)換。不編碼字符有82個(gè):!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z。

例:

var url = “中國(guó)”;

亂碼處理實(shí)例:

/////////////////////////////////////////////////////////////////////////////////////

初始頁面內(nèi)容如下(hello.jsp):

/////////////////////////////////////////////////////////////////////////////////////

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

<%String path = request.getContextPath();%>

AJAX提交頁面

function justdo(){

var post="name=王力猛&email=wallimn@sohu.com&bokee=http://wallimn.bokee.com";

post = encodeURI(post);

post = encodeURI(post);//兩次,很關(guān)鍵var xmlObj = new ActiveXObject('Msxml2.XMLHTTP');

var URL = '<%= path%>/page/act.jsp';//文件名需要調(diào)整成測(cè)試時(shí)的相應(yīng)位置?

xmlObj.open ('post',URL,true);

xmlObj.setrequestheader("cache-control","no-cache");

xmlObj.setrequestheader("Content-Type","application/x-www-form-urlencoded");

xmlObj.send (post);//注意:POST方式,使用這個(gè)來發(fā)送內(nèi)容?

}

/////////////////////////////////////////////////////////////////////////////////////

ajax請(qǐng)求處理頁面(act.jsp)的內(nèi)容如下:

/////////////////////////////////////////////////////////////////////////////////////

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

<%String path = request.getContextPath();%>

<

%@pageimport="java.net.URLDecoder"%>

ajax deal

<%

//遍歷輸出參數(shù)內(nèi)容。

for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {

String h = (String) e.nextElement();

String v = request.getParameter(h);

String mm =?? java.net.URLDecoder.decode(v

,"UTF-8");

System.out.println("請(qǐng)求參數(shù): " + h + " = " + mm);

}

%>

/////////////////////////////////////////////////////////////////////////////////////

說明:

java.net.URLencode和java.net.URLDecode分別對(duì)應(yīng)于JavaScript中的encodeURI和decodeURI、encodeURIComponent和decodeURIComponent.

為什么要連續(xù)兩次調(diào)用encodeURI(String)方法呢?是因?yàn)镴ava中的request.getParameter(String)方法會(huì)進(jìn)行一次URI的解碼過程,調(diào)用時(shí)內(nèi)置的解碼過程會(huì)導(dǎo)致亂碼出現(xiàn)。而URI編碼兩次后,request.getParameter(String)函數(shù)得到的是原信息URI編碼一次的內(nèi)容。接著用java.net.URLDecoder.decode(String str,String codename)方法,將已經(jīng)編碼的URI轉(zhuǎn)換成原文。

2.使用JS中的escape方法。

說明:

escape(String)

對(duì)0-255以外的unicode值進(jìn)行編碼時(shí)輸出%u****格式,其它情況下escape,encodeURI,encodeURIComponent編碼結(jié)果相同。

例:

var url = “中國(guó)”;

亂碼處理實(shí)例:

/////////////////////////////////////////////////////////////////////////////////////

例子跟上面一樣。只有這里不同。

(hello.jsp)

post = escape(post);

post = escape (post);//兩次,很關(guān)鍵

(act.jsp)

String h = (String) e.nextElement();

String v = request.getParameter(h);

String mm =EscapeUnescape.unescape(v,"UTF-8");

System.out.println("請(qǐng)求參數(shù): " + h + " = " + mm);

/////////////////////////////////////////////////////////////////////////////////////

(EscapeUnescape.java)Java中的escape和unescape.內(nèi)容如下:

/////////////////////////////////////////////////////////////////////////////////////

package cn.kgnews.util;

public classEscapeUnescape{

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();

}

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();

}

}

/////////////////////////////////////////////////////////////////////////////////////

說明:

EscapeUnescape.java類是Java中的escape和unescape。

原理跟上例一樣。

3.用JavaScript實(shí)現(xiàn)java中的URLencode跟URLdecode.

說明:

這種方法服務(wù)器端代碼不必修改。直接request.getParameter()來獲取就可以了。

JavaScript中的URLencode跟URLdecode實(shí)現(xiàn)如下:

/////////////////////////////////////////////////////////////////////////////////////

(UrlEncodeUrlDecode_gecko.js)非IE實(shí)現(xiàn)方法如下:

完整代碼可到這里下載:

http://www.blueidea.com/user/qswh/qswhU2GB.js

/////////////////////////////////////////////////////////////////////////////////////

var qswhU2GB = […..]; //此數(shù)組為GB Unicode對(duì)照表

function UrlEncode(str){

var i,c,ret="",strSpecial="!\"#$%&'()*+,/:;<=>?@[\]^`{|}~%";

for(i=0;i

if(str.charCodeAt(i)>=0x4e00){

c=qswhU2GB[str.charCodeAt(i)-0x4e00];

ret+="%"+c.slice(0,2)+"%"+c.slice(-2);

}

else{

c=str.charAt(i);

if(c==" ")

ret+="+";

else if(strSpecial.indexOf(c)!=-1)

ret+="%"+str.charCodeAt(i).toString(16);

else

ret+=c;

}

}

return ret;

}

function UrlDecode(str){

var i,c,d,t,p,ret = "";

function findPos(str){

for(var j = 0; j < qswhU2GB.length; j++){

if(qswhU2GB[j] == str){

return j;

}

}

return -1;

}

for(i = 0;i < str.length;){

c = str.charAt(i);i++;

if(c != "%"){

if(c == "+"){

ret += " ";

}else{

ret += c;

}

}else{

t = str.substring(i,i+2);i += 2;

if(("0x" + t) > 0xA0){

d = str.substring(i+1,i+3);i += 3;

p = findPos(t + d);

if(p != -1){

ret += String.fromCharCode(p + 0x4e00);

}

}else{

ret += String.fromCharCode("0x" + t);

}

}

}

return ret;

}

function getSpell(str,sp){

var i,c,t,ret="";

if(sp==null)sp="";

for(i=0;i

if(str.charCodeAt(i)>=0x4e00){

c=parseInt(qswhU2GB[str.charCodeAt(i)-0x4e00],16);

if(c<55290){

for(t=qswhSpell.length-1;t>0;t=t-2)if(qswhSpell[t]<=c)break;

if(t>0)ret+=qswhSpell[t-1]+sp;

}

}

}

return ret.substr(0,ret.length-sp.length);

}

/////////////////////////////////////////////////////////////////////////////////////

(UrlEncodeUrlDecode_ie.js)IE實(shí)現(xiàn)方法如下:

/////////////////////////////////////////////////////////////////////////////////////

function UrlEncode(str) {

var ret = "";

var strSpecial = " ~!\"#$%&'()*+-,/:;<=>?[]^`{|}~%";

for (var i = 0; i < str.length; i++) {

var chr = str.charAt(i);

strstr = chr;

execScript("c = hex(asc(strstr))","VBScript");

if (parseInt("0x" + c) > 127) {

ret += "%" + c.slice(0,2) + "%" + c.slice(-2);

} else {

if (strSpecial.indexOf(chr) != -1) {

ret += "%" + c.toString(16);

} else {

ret += chr;

}

}

}

return ret;

}

function UrlDecode(str) {

var ret = "";

for (var i = 0; i < str.length; i++) {

var chr = str.charAt(i);

if (chr == "+") {

ret += " ";

} else {

if (chr == "%") {

var asc = str.substring(i + 1,i + 3);

if (parseInt("0x" + asc) > 127) {

temp = parseInt("0x" + asc + str.substring(i + 4,i + 6));

execScript("rt = chr(temp)","VBScript");

ret += rt;

i += 5;

} else {

temp = parseInt("0x" + asc);

execScript("ret = ret + chr(temp)","VBScript");

i += 2;

}

} else {

ret += chr;

}

}

}

return ret;

}

/////////////////////////////////////////////////////////////////////////////////////

(loadcssorjs.js)自動(dòng)識(shí)別瀏覽器動(dòng)態(tài)導(dǎo)入JS/CSS

實(shí)現(xiàn)方法如下:

/////////////////////////////////////////////////////////////////////////////////////

/*

CopyRight(C)CAnca Software Office.

Created by CAnca.2007.9.4

*/

function LoadScript(url) {

document.write("");

}

function LoadCss(url) {

document.write("");

}

var sSuffix = /msie/.test(navigator.userAgent.toLowerCase()) ? "ie" : "gecko";

LoadScript("js/UrlEncodeUrlDecode_" + sSuffix + ".js");

使用方法:

將三個(gè)JS文件放在同目錄。在頁面導(dǎo)入loadcssorjs.js。在要進(jìn)行編碼的地方使用UrlEncode方法即可。

例:

//index.html

var url = “http://cancait.blog.163.com/name=” +UrlEncode(“中國(guó)人”);

window.open(url);

…..

三種解決方案的比較:

第一種,在服務(wù)器端需要一次java.net.URLdecode(String)轉(zhuǎn)碼。使用起來,不太方便。

第二種,要建立Java版的escape跟uncape。在服務(wù)器端還是需要一次uncape轉(zhuǎn)碼。使用起來,不太方便。

第三種,是最方便的一種方法。只需要客戶端進(jìn)行編碼。服務(wù)器端可以不做任何修改。唯一缺點(diǎn)的是:firefox瀏覽網(wǎng)頁時(shí),要加載一個(gè)150K的UrlEncodeUrlDecode_gecko.js文件。影響了瀏覽速度。(但本人還是推薦使用這方案。)

總結(jié):

當(dāng)然,Ajax實(shí)現(xiàn)不亂碼,可以不用這三種方案,用這三種方案,只是迫不得已的做法。通常造成亂碼的原因有以下幾點(diǎn):

1.xmlhttp返回的數(shù)據(jù)默認(rèn)的字符編碼是utf-8,如果前臺(tái)頁面是gb2312或者其它編碼數(shù)據(jù)就會(huì)產(chǎn)生亂碼。

2.post方法提交數(shù)據(jù)默認(rèn)的字符編碼是utf-8,如果后臺(tái)是gb2312或其他編碼數(shù)據(jù)就會(huì)產(chǎn)生亂碼。

解決方法:

推薦方法:由于Javascript沿用java的字符處理方式,內(nèi)部是使用unicode來處理所有字符的。前臺(tái)后臺(tái)都用utf-8編碼,這樣可以省不少麻煩,從根本上解決了亂碼問題.優(yōu)點(diǎn)是效率高,而且符合目前的形式,utf-8編碼本身就是一種比較優(yōu)秀的編碼,沒有語言限制.缺點(diǎn)只能調(diào)用自己的后臺(tái)編碼或者其他的utf-8的編碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,995評(píng)論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,626評(píng)論 18 399
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,311評(píng)論 1 10
  • 個(gè)人學(xué)習(xí)批處理的初衷來源于實(shí)際工作;在某個(gè)迭代版本有個(gè)BS(安卓手游模擬器)大需求,從而在測(cè)試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,974評(píng)論 0 11
  • 《ijs》速成開發(fā)手冊(cè)3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,618評(píng)論 0 7

友情鏈接更多精彩內(nèi)容