JS和JAVA中常用的編碼轉碼函式
1.escape方法對String物件編碼,escape方法返回一個包含了"轉義序列"的字串值。
除了ASCII字母和數字,以及這幾個符號 *+-/[email protected]_外(共有10+52+7=69個字元不會被編碼),
其他所有的字元都會被轉義序列替換,標準ASCII碼內的字元(0-127)和擴充套件的ASCII碼內
的字元(128-255)都用%xx編碼形式代替。字元值大於255的以unicode%uxxxx格式儲存。
注意 :escape方法不能夠用來對統一資源標示符URI進行編碼,因為=&?#等會被編碼.
對URI編碼應使用encodeURI,對URI引數用encodeURIComponent方法。
encodeURI除了ASCII字母和數字,以及這幾個符號 *+-/
其他所有的字元都會被轉義序列替換,標準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*+-/ [email protected]_!#$&\'(),:=?~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*+-/ [email protected]_YES<^';
writeURL("escape",escape(scriptVar));
var enuri='encdec.jsp?param=中文value>123NXX*+-/[email protected]_!#$&\'(),:=?~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*+-/[email protected]_!#$&'(),:=?~YES>^輸出為
server side output -------------------------------------------------------
original param: 中文value>123NXX* -/[email protected]_!
decoded from original param: 中文value>123NXX* -/[email protected]_!
client side output---------------------------------------------
escape:encdec.jsp%3Fparam%3D%u4E2D%u6587value%3E123NXX*+-/[email protected]_YES%3C%5E
encodeURI:encdec.jsp?param=%E4%B8%AD%E6%96%87value%3E123NXX*+-/[email protected]_!#$&'(),:=?~YES%3E%5E
encodeURIComponent:encdec.jsp%3Fparam%3D%E4%B8%AD%E6%96%87value%3E123NXX*-_.~!'()YES%3E%5E
URLEncoder: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%5E
unescape URLEncoder:param=??-???value>123NXX*+-/[email protected]_!#$&'(),:=?~YES>^
decodeURI URLEncoder:param%3D中文value>123NXX*%2B-%2F.%40_!%23%24%26'()%2C%3A%3D%3F~YES>^
decodeURIComponent URLEncoder:param=中文value>123NXX*+-/[email protected]_!#$&'(),:=?~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的引數還原成字串。
相關推薦
JS和JAVA中常用的編碼轉碼函式
js中escape,encodeURI,encodeURIComponent函式和unescape,decodeURI和decodeURIComponent函式的功能1.escape方法對String物件編碼,escape方法返回一個包含了"轉義序列"的字串值。除了ASCII
js和java中字元和unicode編碼的轉化
一般來說,良好的程式設計習慣要求在程式碼裡儘量不出現中文,一個是國際化問題,即同一份程式碼可能要滿足不同語言的顯示,還一個就是可能產生亂碼問題,不同的程式設計師用不同的IDE匯入這份程式碼可能使用了不同的預設編碼。 然而有些場景是必須保持中文的,比如讀取某個帶樣式文字的字型
JS 和 Java 中URL特殊字元編碼方式
JavaScript 1. 編碼 escape(String) 其中某些字元被替換成了十六進位制的轉義序列。 解碼 unescape(String) 該函式的工作原理是這樣的:通過找到形式為 %xx 和 %uxxxx 的字元序列(x
C#和JAVA中編寫事務代碼
com creat .class eas ++ acc data savepoint return C# DAL層代碼,運行多條增刪改,使用事務操作: /// <summary> /// 運行 多條增刪改 (非查詢語句)
js和java中使用正則表達式校驗郵箱
reg 表達 mat 表達式 正則表達式 javascrip 格式 正則 pri 問題:經常在項目中要校驗郵箱? 郵箱格式:首位必須為字母,必須包含一個@符號,並且@之後有個名字,之後還有個.,再有一個後綴名 例如:[email protected] 一、java
js和java中的AES加密和解密
每次都要在這個問題上耗費一天的時間,所以這次留下記錄免得以後麻煩。 JS端使用CryptoJS,服務端bouncy castle提供的AES演算法。 AES演算法採用“AES/CBC/PKCS7Padding”,這個在JS和JAVA中都支援。Java預設的加
json在js和java中的使用
在程式語言中,只要有了陣列(array)和物件(object)就能夠儲存一切資料,同時在不同的語言之間進行資料交換的時候,傾向於使用字串,因為字串在各個語言中的處理方式大致相同,那麼JSON的誕生也就在情理之中了。 JSON的優勢在於: (1).JSON是純文字格式,是獨
js和java中陣列的區別和定義方式
區別:java中:定義陣列必須指定長度,而且長度確定下來之後無法改變。 js中:js中的陣列和java中的集合差不多,長度是可變的,也沒有強制要求必須定義長度。 定義方法:java: int a[] = new int[3];//定義一個新陣列
js和java中日期和日期字串的相互轉換和使用
摘要:在工作中只要牽扯到日期,很大可能都會牽扯到日期的計算格式的轉換等用法,這篇文章就是要探討一下平常在 js和java中對於日期的使用。 js中日期的使用 js中日期的計算 和 比較 js中兩個日期字串的計算 ###########
java中url中文轉碼問題
public static void main(String[] args){ try { System.out.println("中文");//1 System.out.println("中文".getBytes(
js和java之間的中文Base64轉碼
中文js和java之間的Base64轉碼 使用現有的js和Java包 1、js 使用jquery.base64.js進行編碼。 下載連結: 2、java使用Base64.decodeBase64進行解碼。 //maven <dependency>
JAVA中常用IO流類:FileInputStream和FileOutputStream
table string [] 文件中 讀取 描述符 off fis 系統資源 FileInputStream 用於讀取本地文件中的字節數據,繼承自InputStream類 構造方法摘要 FileInputStream(File file) 通
C#DES加密,JavaDES解密,另轉C#和Java實現Des完整代碼
sso output uri sta RM light ash for str C#DES加密,JavaDES解密,另轉C#和Java實現Des完整代碼 轉載 2014年06月17日 17:36:09 標簽: DES / C#DES / JavaDES /
java中的中文字符轉碼技術
str 字符轉換 clas println pre supported coder static import package com.yin.test; import java.io.UnsupportedEncodingException; import j
字元編碼和Java中的亂碼問題
ASCII碼 在計算機內部,所有的資訊最終都表示為一堆二進位制形式的資料。每一個二進位制位(bit)有0和1兩種狀態,因此八個二進位制位就可以組合出256種狀態,稱為一個位元組(byte),從0000000到11111111。上世紀60年代,美國製定了一套字元編碼,
java URL中含有漢字轉碼格式
傳入url即可實現 public static String toUtf8String(String s) { StringBuffer sb = new StringBuffer();
淺談Python和VC中的編碼問題(轉)
以前編碼問題總能讓自己湊或蒙過去,最近要做一個專案伺服器端用python寫,客戶端用c++,工程編譯的字符集使用UNICODE。之間通過socket進行通訊,通訊過程中編碼轉換問題把我搞得暈頭轉向,逼著我將編碼問題好好研究一番。 首先先談談VC中的編碼問題,首先編碼我們大致
Java中文編碼及各種編碼互轉和Java判斷檔案編碼
Unicode UTF-8 GBK 及一點Java程式碼 Unicode UTF-8 GBK這些不同的編碼,我們可以想象為不同的字典。同一個漢字,在不同的字典裡面,我們用不同的編號儲存。比如漢字"陳"在Unicode裡編號為9648,在GBK裡面是0xB3C2,在UTF-8
JAVA中常用IO流類:BufferedReader和BufferedWriter
BufferedReader類用於緩衝讀取字元,將位元組流封裝成BufferedReader物件,然後用readLine()逐行讀入字元流,直到遇到換行符為止(相當於反覆呼叫Reader類物件的read()方法讀入多個字元) 下面摘抄自JAVA API文件 publ
linux下大檔案編碼轉碼及將oracle中資料匯入mysql
這篇文章有不少廢話,只是為了發洩一下。如果讀者找需要解決的問題的辦法,直接無視這些廢話。 最近做的專案要將Oracle中資料匯入Mysql, 資料量約有兩千萬條,慶幸的是隻有一張表,而且資料結構比較簡單。在這個過程中遇到不少坑,現在