JS和JAVA中常用的編碼轉碼函數


js中escape,encodeURI,encodeURIComponent函數和unescape,decodeURI和decodeURIComponent函數的功能
1.escape方法對String對象編碼,escape方法返回一個包含了"轉義序列"的字符串值。
除了ASCII字母和數字,以及這幾個符號 *+-/.@_外(共有10+52+7=69個字符不會被編碼),
其他所有的字符都會被轉義序列替換,標准ASCII碼內的字符(0-127)和擴展的ASCII碼內
的字符(128-255)都用%xx編碼形式代替。字符值大於255的以unicode%uxxxx格式存儲。
注意 :escape方法不能夠用來對統一資源標示符URI進行編碼,因為=&?#等會被編碼.
對URI編碼應使用encodeURI,對URI參數用encodeURIComponent方法。
encodeURI除了ASCII字母和數字,以及這幾個符號 *+-/.@_!#$&\'(),:=?~外(共有10+52+20=82個字符不會被編碼),
其他所有的字符都會被轉義序列替換,標准ASCII碼內的字符(0-127)和擴展的ASCII碼內
的字符(128-255)都用%xx編碼形式代替。字符值大於255的以utf-8多字節%xx格式存儲。
在URI中有特殊意義的字符如?=&等不會被編碼。
encodeURIComponent除了ASCII字母和數字,以及這幾個符號 *-_.~!'()外(共有10+52+9=71個字符不會被編碼),
其他所有的字符都會被轉義序列替換,標准ASCII碼內的字符(0-127)和擴展的ASCII碼內
的字符(128-255)都用%xx編碼形式代替。字符值大於255的以utf-8多字節%xx格式存儲。
可以看到?=&等在URI中有特殊意義的字符也會被編碼。
encodeURIComponent方法在編碼單個URIComponent(指請求參數)應當是最常用的,
它可以將參數中的中文、特殊字符進行轉義,而不會影響整個URL。
一個測試的JSP實例:

utilits:function writeToDom(str){
document.writeln(str);
}
function writelnToDom(str){
document.writeln(str + "<br>");
}

function writeURL(type,str){
document.writeln(type +":<a href=\"" + str + "\">" + str + "</a><br>");
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.net.URLDecoder,java.net.URLEncoder"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test encoding decoding</title>
<script type="text/javascript" src="../js/utilits.js"></script>
</head>
<%
    request.setCharacterEncoding("utf-8");
String param = request.getParameter("param");
    System.out.println("original " + param);
    String urlEncodedparam = URLEncoder.encode("param=中文value>123NXX*+-/.@_!#$&\'(),:=?~YES>^","UTF-8");

    out.write("server side output -------------------------------------------------------  ");
    out.write("<br>original param: " + param);
    out.write("<br>decoded from original param: " + URLDecoder.decode(request.getParameter("param"),"UTF-8"));
%>
<script>
    writelnToDom("<br> client side output---------------------------------------------");

    var scriptVar='encdec.jsp?param=中文value>123NXX*+-/.@_YES<^';
    writeURL("escape",escape(scriptVar));
    
    var enuri='encdec.jsp?param=中文value>123NXX*+-/.@_!#$&\'(),:=?~YES>^';
    writeURL("encodeURI",encodeURI(enuri)); //只有這個做法的URL最終可用被正確訪問
    
    var enuricomp='encdec.jsp?param=中文value>123NXX*-_.~!\'()YES>^';
    writeURL("encodeURIComponent",encodeURIComponent(enuricomp));
    
        writeURL("URLEncoder","<%=urlEncodedparam%>");
    writeURL("response encodeurl","<%=response.encodeURL("encdec.jsp?param=中文value&other=abcd")%>");
    writeURL("plain url","encdec.jsp?param=中文value&other=abcd");
     writelnToDom("unescape URLEncoder:" + unescape("<%=urlEncodedparam%>"));
    writelnToDom("decodeURI URLEncoder:" + decodeURI("<%=urlEncodedparam%>"));
    writelnToDom("decodeURIComponent URLEncoder:" + decodeURIComponent("<%=urlEncodedparam%>"));
</script>
<body>
</body>
</html>
訪問http://localhost:8080/prjWebSec/encode/encdec.jsp?param=中文value>123NXX*+-/.@_!#$&'(),:=?~YES>^
輸出為
server side output -------------------------------------------------------original param: 中文value>123NXX* -/.@_!decoded from original param: 中文value>123NXX* -/.@_!client side output---------------------------------------------escape:encdec.jsp%3Fparam%3D%u4E2D%u6587value%3E123NXX*+-/.@_YES%3C%5EencodeURI:encdec.jsp?param=%E4%B8%AD%E6%96%87value%3E123NXX*+-/.@_!#$&'(),:=?~YES%3E%5EencodeURIComponent:encdec.jsp%3Fparam%3D%E4%B8%AD%E6%96%87value%3E123NXX*-_.~!'()YES%3E%5EURLEncoder:param%3D%E4%B8%AD%E6%96%87value%3E123NXX*%2B-%2F.%40_%21%23%24%26%27%28%29%2C%3A%3D%3F%7EYES%3E%5Eunescape URLEncoder:param=??-???value>123NXX*+-/.@_!#$&'(),:=?~YES>^decodeURI URLEncoder:param%3D中文value>123NXX*%2B-%2F.%40_!%23%24%26'()%2C%3A%3D%3F~YES>^decodeURIComponent URLEncoder:param=中文value>123NXX*+-/.@_!#$&'(),:=?~YES>^
可以看到escape和encodeURIComponent都會將? =等在URI中有特殊意義的字符進行了編碼.
這樣的話,URL就不能被正常訪問了.
[如果你是在tomcat中測試的話,需要在server.xml中加上
 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>]
2.unescape方法,解碼用escape方法進行了編碼的String對象。
unescape方法返回一個包含charstring內容的字符串值。
所有以%xx十六進制形式編碼的字符都用ASCII字符集中等價的字符代替。
以%uxxxx格式(Unicode字符)編碼的字符用十六進制編碼xxxx對應的Unicode字符代替.
注意:unescape方法不能用於解碼統一資源標識碼(URI)。escape和unescape以經不推薦使用。
解碼encodeURI和encodeURIComponent編碼過的內容用decodeURI和decodeURIComponent方法。

JAVA代碼中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,所以不應該用來對URI做encoding,
只應該對URI中的某一個參數值做編碼。它會將處字母和數字,以及*字符外的都編碼成%xx形式.
JS的unescape和decodeURI都不能用來解碼JAVA中URLEncoder.encode編碼的字符串。
在JAVA代碼中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent還原成字符串。
在JAVA代碼中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")來將在JS中
用encodeURIComponent的參數還原成字符串。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com