那些年JavaWeb的各種中文亂碼終極解決方法!!

2021-06-09 17:52:55 字數 4184 閱讀 7117

一、servlet輸出亂碼

1. 用servlet.getoutstream位元組流輸出中文,假設要輸出的是string str ="釣魚島是中國的,無恥才是日本的"。

1.1 若是本地伺服器與本地客戶端這種就不用說了,直接可以out.write(str.getbytes())可以輸出沒有問題。因為伺服器中用str.getbytes()是採用預設本地的編碼,比如gbk。而瀏覽器也解析時也用本地預設編碼,兩者是統一的,所以沒有問題。

1.1 若伺服器輸出時用了, out.write(str.getbytes("utf-8"))。而本地預設編碼是gbk時(比例在中國),那麼用瀏覽器開啟時就會亂碼。因為伺服器傳送過來的是utf-8的1010資料,而客戶端瀏覽器用了gbk來解碼,兩者編碼不統一,肯定是亂碼。當然,你也可以自己將客戶端瀏覽器的編碼手工呼叫下(ie選單是:查詢view->編碼encoding->utf-8),但是這種操作很爛,最好由伺服器輸出響應頭告訴,瀏覽器用哪種編碼來解碼。所以要在伺服器的servlet中,增加response.setheader("content-type","text/html;charset=utf-8"),當然也可直接用簡單的response.setcontenttype("text/hmtl;charset=utf-8")。兩種的操作是一樣一樣的。

2. 用servlet.getwirter字元流輸出中文,假設要輸出的是string str ="釣魚島是中國的,無恥才是日本的"。

2.1 若寫成out.print(str)輸出時,客戶端瀏覽器顯示的將全是多個?????的字元,代表在編碼表中肯定就找不到相應的字元來顯示。原因是:servlet.getwriter()得到的字元輸出流,預設對字元的輸出是採用iso-8859-1,而iso-8859-1肯定是不支援中文的。所以肯定要首先要做的第一件事:是要將伺服器物件輸出字元能支援中文的。其次伺服器向客戶端寫回的響應頭要告訴客戶端是用了哪種編碼表進行編碼的。而實現這兩個需求,只需要response.setcontenttype("text/hmtl;charset=utf-8")。就搞定了。特別注意:response.setcontenttype("text/html;charset=utf-8")要放在printout out = response.getwriter()**的前面,否則只是有告訴客戶端用什麼碼表編碼的功能,而伺服器端還是用iso-8859-1編碼了。再特別提示下:在同一servlet中的doget或dopost方法中,不能既用response.getoutputstream又用response.getwriter,因為這兩種response的響應輸出位元組流與字元流是衝突的,只能用其一。

//獲取檔案的url位址

string realpath = getservletcontext().getrealpath("/釣魚島是中國的無恥才是日本的歷史證據.jpg");

//獲取檔名: 釣魚島是中國的無恥才是日本的歷史證據.jpg

string filename = realpath.substring(realpath.lastindexof("\\")+1);

//注意這裡一般都用urlencoder的encode方法進行對檔名進行編碼

string enfilename = urlencoder.encode(filename, "utf-8");

//enfilename檔名若含有中文必須用urlencoding進行編碼

response.setheader("content-disposition", "attachment;filename="+enfilename);

//檔案讀取與輸出,模板**了...

inputstream in = new fileinputstream(realpath);

outputstream out = response.getoutputstream();

int len = -1;

byte buf = new byte[1024];

while((len=in.read(buf))!=-1)

in.close();

三、servlet的response增加addcookie,cookie中value的中文碼問題解決方法。

關於cookie的原理,見  若想將cookie中存放中文的值,必須用base64編碼後,發給客戶瀏覽器端進入儲存。而下次客戶端瀏覽訪問是帶回來的cookie中的值,是經過base64編碼的,所以需要用base64解碼即可。 base64編碼主要是解決將特殊字元進行重新編碼,編碼成a-b、a-b、0-9、+與/,字元52,10個數字與乙個+,乙個/ 共64個字元。它的原理是將原來3個位元組的內容編碼成4個位元組。主要是取位元組的6位後,在前面補00組成乙個新的位元組。所以這樣原來的3個位元組共24,被編碼成4個位元組32位了。

具體**示例如下:

response.setcontenttype("text/html;charset=utf-8");

request.setcharacterencoding("utf-8");

string getusername = request.getparameter("username");

printwriter out = response.getwriter();

string username = null;

//獲取客戶端提交過來的cookie陣列。

cookie cookies = request.getcookies();

for (int i = 0; cookies != null && i < cookies.length; i++)

} out.print(username + ",恭喜您登入成功......"+getusername); //username從cookie中得出來,getusername從請求引數中

system.out.println(username+"------------");

string remember = request.getparameter("remember");

//中文必須要進行 base64進行加碼,才能作為cookie的值

getusername = base64coder.encode(getusername);

//將編碼後的中文username的作為cookie的value

cookie cookie = new cookie(constant.user_info, getusername);

cookie.setpath(getservletcontext().getcontextpath());

if(null != remember)else

response.addcookie(cookie);

四、獲取請求引數亂碼

get方式的亂碼:如中國

」>cn

,直接用

request.getparameter

得到的字串

strcn

將會亂碼,這也是因為

get方式是用

的url

傳過來的預設用

iso-8859-1

編碼的,所以首先得到的

strcn

要再用iso-8859-1

編碼得到原文後,再進行用

utf-8(

看具體頁面的

charset

是什麼utf-8

或gbk)

進行解碼即可。

newstring(strcn.getbytes(「iso-8859-1」),「utf-8」);

string strcn = request.getparameter("name");

string name = new string(strcn.getbytes(「iso-8859-1」),「utf-8」);

這種方式操作比較麻煩的是,有乙個引數要用iso-8859-1編碼一次再解碼一次。

post

方式的亂碼:只需要

request.setcharacterencoding("utf-8"):

即可。

request.setcharacterencoding("utf-8");

string name = request.getparameter("name");

JavaWeb的各種中文亂碼終極解決方法

一 servlet輸出亂碼 1.用servlet.getoutstream位元組流輸出中文,假設要輸出的是string str 釣魚島是中國的,無恥才是日本的 1.1 若是本地伺服器與本地客戶端這種就不用說了,直接可以out.write str.getbytes 可以輸出沒有問題。因為伺服器中用st...

JavaWeb的各種中文亂碼終極解決方法

一 servlet輸出亂碼 1.用servlet.getoutstream位元組流輸出中文,假設要輸出的是string str 釣魚島是中國的,無恥才是日本的 1.1 若是本地伺服器與本地客戶端這種就不用說了,直接可以out.write str.getbytes 可以輸出沒有問題。因為伺服器中用st...

JavaWeb的各種中文亂碼終極解決方法

一 servlet輸出亂碼 1.用servlet.getoutstream位元組流輸出中文,假設要輸出的是string str 釣魚島是中國的,無恥才是日本的 1.1 若是本地伺服器與本地客戶端這種就不用說了,直接可以out.write str.getbytes 可以輸出沒有問題。因為伺服器中用st...