Response一些常用的場景和瀏覽器和服務器間編碼問題

問題一、中文輸出到瀏覽器亂碼問題

		//設置編碼格式 即便在這裏設置了編碼格式,但是輸出到瀏覽器中仍然會亂碼
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("Utf-8");
		String str ="中國";
		//亂碼---?? 這個如果要使用writer需要配合setCharacterEncoding方法一起使用
		//response.getWriter().write(str);
		//使用這種方式也是亂碼--涓浗
		OutputStream os = response.getOutputStream();
		//os.write(str.getBytes("utf-8"));
		//解決辦法--程序中使用什麼編碼處理那麼就告訴瀏覽器用什麼編碼解讀-這種方式沒有亂碼,記下
		//幾款主流瀏覽器默認的編碼格式
		response.setHeader("Content-type", "text/html;charset=UTF-8");
		os.write(str.getBytes("utf-8"));
//打印數字1 如果直接用writer輸出會提示下載文件並且是亂碼,但是如果用setCharacterEncoding方法後就是不提示下載也沒有顯示
		//response.setCharacterEncoding("UTF-8");
		//response.getOutputStream().write(1);
		//response.getOutputStream().write(1);
		//下面的方法可以正常的輸出到瀏覽器中,同時也可以說明,對於需要在瀏覽器中顯示的數據最好都以字符串的形式傳輸
		response.setHeader("Content-type", "text/html;charset=utf-8");
		OutputStream os = response.getOutputStream();
		os.write((1+"").getBytes("UTF-8"));

          總結,一般如果使用writer的話,需要配合setCharacterEncoding,並且需要設置瀏覽器的解析格式setHeader("Content-type","text/html;charset=utf-8");使用OutPutstream進行處理的話必須將輸出的東西進行轉碼後在進行輸出,並且設置瀏覽器的解碼格式。

 二、登錄成功之後的跳轉。

//		通常refresh用於程序登錄成功之後的跳轉
		response.setCharacterEncoding("utf-8");
		response.setHeader("refresh", "3;url='https://www.baidu.com'");
		response.setHeader("Content-type", "text/html;charset=uft-8");
		response.getWriter().write("恭喜你!登陸成功。3秒後跳轉到首頁,如果沒有跳轉,請點擊<a color='red' href='https://www.baidu.com'>首頁</a>");

三、文件下載中的編碼問題

 

		/*
		 * 1、獲取文件的絕對路徑
		 * 2、設置content-disposition響應頭控制瀏覽器以下載的形式打開文件
		 * 3、獲取要下載的文件輸入流。
		 * 4、創建緩衝區
		 * 5、獲取輸出流
		 * 6、輸出到瀏覽器端
		 */
//		File f = new File("白豆腐.jpg");//這個路徑是/home/lxj/白豆腐.jpg 如果要獲取某個資源必須知道他的絕對路徑
//		InputStream is = new FileInputStream(f);
		
//		System.out.println(f.getAbsolutePath());
//		當前服務器的絕對路徑--這種方式可以獲取相關的資源文件
		String path = this.getServletContext().getRealPath("/");
		File f = new File(path+"/"+"白豆腐.jpg");
		InputStream is = new FileInputStream(f);
		response.setHeader("Content-type", "application/x-download;charset=utf-8");
//		這個方式還是不能夠正確的顯示中文的文件名
//		response.setHeader("Content-Disposition", "attachment;filename="+new String("白豆腐33.jpg".getBytes("utf-8")));
//		網上說HTTP傳輸先默認的按照ISO8859-1編碼,瀏覽器默認解碼也是按照這個來的--ok
		response.setHeader("Content-Disposition", "attachment;filename="+new String("白豆腐33.jpg".getBytes("utf-8"),"ISO8859-1"));
//		禁止瀏覽器緩存
//		response.setDateHeader("expries", -1); //緩存時間
//		response.setHeader("Cache-Control", "no-cache");
//		response.setHeader("Pragma", "no-cache");
//		response.setHeader("refresh", "3"); // 設置refresh響應頭控制瀏覽器每隔3秒鐘刷新一次
		OutputStream os = response.getOutputStream();
		byte[] buffer = new byte[1024];
		int len ;
		while ((len = is.read(buffer))>0) {
			os.write(buffer, 0, len);
		}
        問題:文件路徑問題-如果直接new File("xx.jpg"),讀取的路徑並不是當前應用的路徑下的文件,而是當前用戶下的某個文件,使用this.getServletContext().getRealPath("/")獲取當前應用的絕對路徑,然後獲取應用下的文件;另外一個就是數據編碼問題,因爲是下載並不在瀏覽器顯示,所以對傳輸數據的格式不作要求,唯一需要注意的是文件名字這,需要注意編碼問題。瀏覽器默認的解碼格式是ISO8859-1,所以需要現將字符串由UTF-8轉換之後再保存這樣就不會出現亂碼了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章