1. 程式人生 > >JS和JAVA中常用的編碼轉碼函式

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

js中escape,encodeURI,encodeURIComponent函式和unescape,decodeURI和decodeURIComponent函式的功能
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字母和數字,以及這幾個符號 *+-/
[email protected]
_!#$&\'(),:=?~外(共有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*+-/
[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的引數還原成字串。

相關推薦

JSJAVA常用編碼函式

js中escape,encodeURI,encodeURIComponent函式和unescape,decodeURI和decodeURIComponent函式的功能1.escape方法對String物件編碼,escape方法返回一個包含了"轉義序列"的字串值。除了ASCII

jsjava字元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> /// 運行 多條增刪改 (非查詢語句)

jsjava使用正則表達式校驗郵箱

reg 表達 mat 表達式 正則表達式 javascrip 格式 正則 pri 問題:經常在項目中要校驗郵箱?   郵箱格式:首位必須為字母,必須包含一個@符號,並且@之後有個名字,之後還有個.,再有一個後綴名   例如:[email protected]   一、java

jsjava的AES加密解密

每次都要在這個問題上耗費一天的時間,所以這次留下記錄免得以後麻煩。 JS端使用CryptoJS,服務端bouncy castle提供的AES演算法。 AES演算法採用“AES/CBC/PKCS7Padding”,這個在JS和JAVA中都支援。Java預設的加

json在jsjava的使用

在程式語言中,只要有了陣列(array)和物件(object)就能夠儲存一切資料,同時在不同的語言之間進行資料交換的時候,傾向於使用字串,因為字串在各個語言中的處理方式大致相同,那麼JSON的誕生也就在情理之中了。 JSON的優勢在於: (1).JSON是純文字格式,是獨

jsjava陣列的區別定義方式

區別:java中:定義陣列必須指定長度,而且長度確定下來之後無法改變。            js中:js中的陣列和java中的集合差不多,長度是可變的,也沒有強制要求必須定義長度。 定義方法:java: int a[] = new int[3];//定義一個新陣列

jsjava日期日期字串的相互轉換使用

摘要:在工作中只要牽扯到日期,很大可能都會牽扯到日期的計算格式的轉換等用法,這篇文章就是要探討一下平常在 js和java中對於日期的使用。 js中日期的使用 js中日期的計算 和 比較 js中兩個日期字串的計算 ###########

javaurl中文問題

public static void main(String[] args){ try { System.out.println("中文");//1 System.out.println("中文".getBytes(

jsjava之間的中文Base64

中文js和java之間的Base64轉碼 使用現有的js和Java包 1、js 使用jquery.base64.js進行編碼。 下載連結: 2、java使用Base64.decodeBase64進行解碼。 //maven <dependency>

JAVA常用IO流類:FileInputStreamFileOutputStream

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

淺談PythonVC編碼問題()

以前編碼問題總能讓自己湊或蒙過去,最近要做一個專案伺服器端用python寫,客戶端用c++,工程編譯的字符集使用UNICODE。之間通過socket進行通訊,通訊過程中編碼轉換問題把我搞得暈頭轉向,逼著我將編碼問題好好研究一番。 首先先談談VC中的編碼問題,首先編碼我們大致

Java中文編碼及各種編碼Java判斷檔案編碼

Unicode UTF-8 GBK 及一點Java程式碼 Unicode UTF-8 GBK這些不同的編碼,我們可以想象為不同的字典。同一個漢字,在不同的字典裡面,我們用不同的編號儲存。比如漢字"陳"在Unicode裡編號為9648,在GBK裡面是0xB3C2,在UTF-8

JAVA常用IO流類:BufferedReaderBufferedWriter

 BufferedReader類用於緩衝讀取字元,將位元組流封裝成BufferedReader物件,然後用readLine()逐行讀入字元流,直到遇到換行符為止(相當於反覆呼叫Reader類物件的read()方法讀入多個字元) 下面摘抄自JAVA API文件 publ

linux下大檔案編碼及將oracle資料匯入mysql

        這篇文章有不少廢話,只是為了發洩一下。如果讀者找需要解決的問題的辦法,直接無視這些廢話。             最近做的專案要將Oracle中資料匯入Mysql, 資料量約有兩千萬條,慶幸的是隻有一張表,而且資料結構比較簡單。在這個過程中遇到不少坑,現在