問題一、中文輸出到瀏覽器亂碼問題
//設置編碼格式 即便在這裏設置了編碼格式,但是輸出到瀏覽器中仍然會亂碼
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轉換之後再保存這樣就不會出現亂碼了。