java與js編碼的使用
java編碼
在IO操作中我們一般需要進行編碼,這裡的IO操作包括磁碟IO、網路IO等
import org.apache.catalina.servlet4preview.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.util.Date; @RequestMapping("export") public void export(String modeCode, HttpServletRequest request, HttpServletResponse response){ try{ request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/x-download"); String fileName = "匯出檔案"+ (StringUtil.isEmpty(modeCode)?"":("_"+modeCode))+"_"+ DateUtil.formatDefTime(new Date())+".xlsx"; fileName = URLEncoder.encode(fileName, "UTF-8"); response.addHeader("Content-Disposition", "attachment;filename=" + fileName); service.exportExe(modeCode,request,response); }catch(Exception e){ e.printStackTrace(); } }
Java中使用String型別也是可以指定位元組到字元轉換的編碼字符集的。
1 String xxx = "你好"; 2 String yyy = new String(xxx.getBytes(), "utf-8"); 3 System.out.println(yyy); import java.io.UnsupportedEncodingException; /** * 字串 通用 工具類 * @author Administrator */ public class StringUtil { private static final char UNDERLINE='_'; public static String enCode(String path, String enCode) { try { return new String(path.getBytes(), enCode); } catch (UnsupportedEncodingException e) { } return path; } }
@GetMapping("/get/{attId}") public void download(@PathVariable Integer attId, HttpServletResponse response) throws IOException { Attachment attachment = service.getById(attId); String fileName = new String(attachment.getFileName().getBytes("UTF-8"),"ISO8859-1");//中文需要編碼下 response.addHeader("Content-Disposition", "attachment;filename=" + fileName); response.addHeader("Content-Type","application/octet-stream;charset=UTF-8"); ServletOutputStream out = response.getOutputStream(); out.write(attachment.getAttachmentContent()); out.flush(); out.close(); }
js編碼
URI: Uniform ResourceIdentifiers,通用資源識別符號
Global物件的encodeURI()和encodeURIComponent()方法可以對URI進行編碼,以便傳送給瀏覽器。有效的URI中不能包含某些字元,例如空格。而這URI編碼方法就可以對URI進行編碼,它們用特殊的UTF-8編碼替換所有無效的字 符,從而讓瀏覽器能夠接受和理解。
其中encodeURI()主要用於整個URI(例如,http://www.jxbh.cn/illegal value.htm),而encode-URIComponent()主要用於對URI中的某一段(例如前面URI中的illegal value.htm)進行編碼。它們的主要區別在於,encodeURI()不會對本身屬於URI的特殊字元進行編碼,例如冒號、正斜槓、問號和井字號;而encodeURIComponent()則會對它發現的任何非標準字元進行編碼。來看下面的例子:
var uri="http://www.jxbh.cn/illegal value.htm#start";
//”http: //www.jxbh.cn/illegal%20value .htm#s tart”
alert(encodeURI (uri)):
//”http% 3A%2F%2Fwww.jxbh.cn%2 Fillegal%2 0value. htm%23 start”
alert( encodaURIComponent (uri));
使用encodeURI()編碼後的結果是除了空格之外的其他字元都原封不動,只有空格被替換成了%20。而encodeURIComponent()方法則會使用對應的編碼替換所有非字母數字字元。這也正是可以對整個URI使用encodeURI(),而只能對附加在現有URI後面的字串使用encodeURIComponent()的原因所在。一般來說,我們使用encodeURIComponent()方法的時候要比使用encodeURI()更多,因為在實踐中更常見的是對查詢字串引數而不是對基礎URL進行編碼.
經我的觀測,很多網站的cookie在進行編碼的時候,是encodeURIComponent格式的,所以應該使用decodeURIComponent()進行解碼
Performs the md5 hash on a string.
SparkMD5.hash = function (str, raw) {
// converts the string to utf8 bytes if necessary
if (/[\u0080-\uFFFF]/.test(str)) {
str = unescape(encodeURIComponent(str));
}
var hash = md51(str);
return !!raw ? hash : hex(hash);
};
前端編碼兩次:encodeURI(encodeURI(要編碼的中文),'')
後端解碼:URLDecoder.decode(request.getParameter(對應的欄位名稱), "UTF-8")
或者把請求方式變為post也能解決這個問題,想後端通過http的方式呼叫遠端的介面,可以把中文編碼,對header中加入
httpGet.setHeader("Content-Type","application/text; charset=UTF-8");這樣相當於告訴了接收方字元的型別和編碼方式
//這裡設定統一的頭資訊
$.ajaxSetup({
beforeSend: function (xhr) {
//alert(this.url);
if (this.url) {
if (!this.url.contains("http"))
this.url = $Core.SERVICEPATH() + this.url;
}
},
//dataType: "josn",
headers: {
'token': $Core.USER().TOKEN,
'appid': $Core.APPID
},
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
timeout: $Core.Config.ajaxTimeout,
cache: false,
//xhrFields: {
// withCredentials: true
//},
//dataType:"json",
crossDomain: true,
complete: function (XHR, TS) {
if (TS === "success") {
var result = XHR.responseJSON;
if (result && result.code != undefined) {
if (result.code == "500") {
showError(this, 500, result.msg);
return false;
}
else if (result.code == "401") { //登入資訊失敗
showError(this, 401, "您的登入資訊已經失效,請重新登入系統!", $Core.TimeOut);
return false;
}
else if (result.code == "403") { //資源資訊失敗
return false;
}
}
}
//console.log(XHR, TS);
}
});