1. 程式人生 > >java與js編碼的使用

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

        });