3 回答

TA貢獻1862條經(jīng)驗 獲得超6個贊
我只想補充一點(當(dāng)然,對于POST方法來說)
request.setCharacterEncoding("UTF-8");
在讀取任何參數(shù)之前調(diào)用。以下是讀取參數(shù)的實現(xiàn)方式:
@Overridepublic?String?getParameter(String?name)?{ ????if?(!parametersParsed)?{ ????????parseParameters(); ????} ????return?coyoteRequest.getParameters().getParameter(name);}
如你所見,有一面旗幟參數(shù)分析這是在第一次讀取任何參數(shù)時設(shè)置的,parseParameters()方法將解析所有請求的參數(shù)并設(shè)置編碼。呼叫:
request.setCharacterEncoding("UTF-8");
在對參數(shù)進行解析后,不會產(chǎn)生任何影響!這就是為什么有些人抱怨設(shè)置請求的編碼不起作用。這里的大多數(shù)答案都建議使用servlet過濾器并在那里設(shè)置字符編碼。這是正確的,但也要注意,一些安全庫可以在篩選器之前讀取請求參數(shù)(這是我的情況),因此如果在此之后執(zhí)行篩選器,則請求參數(shù)的字符編碼已經(jīng)設(shè)置,設(shè)置UTF-8或任何其他參數(shù)都不會產(chǎn)生任何效果。

TA貢獻1828條經(jīng)驗 獲得超4個贊
如果根本沒有正確設(shè)置請求和/或響應(yīng)編碼,就會發(fā)生這種情況。
對于GET請求,需要在servlet容器級別配置它。目前還不清楚您使用的是哪一種,但例如Tomcat,這是由URIEncoding
屬性<Connector>
元素/conf/server.xml
.
<Connector?...?URIEncoding="UTF-8">
對于POST請求,您需要創(chuàng)建一個濾光器它被映射到所需的URL模式上,涵蓋所有這些POST請求。例如:*.jsp
甚至/*
..執(zhí)行以下工作doFilter()
:
request.setCharacterEncoding("UTF-8");chain.doFilter(request,?response);
對于提交的HTML表單輸入值的HTML響應(yīng)和客戶端編碼,您需要設(shè)置JSP頁面編碼。將其添加到JSP的頂部(考慮到顯示UTF-8直表格DB的效果很好,您可能已經(jīng)正確地完成了這一工作)。
<%@page?pageEncoding="UTF-8"?%>
或者,為了防止在每一個JSP上復(fù)制它,只需在web.xml
:
<jsp-config> ????<jsp-property-group> ????????<url-pattern>*.jsp</url-pattern> ????????<page-encoding>UTF-8</page-encoding> ????</jsp-property-group></jsp-config>
對于源代碼文件和stdout(IDE控制臺),需要設(shè)置IDE工作區(qū)編碼。目前還不清楚您使用的是哪一種,但例如,Eclipse要通過設(shè)置窗口>首選項>通用>工作區(qū)>文本文件編碼去UTF-8。
請注意HTML<meta http-equiv>
標簽是被忽視當(dāng)通過HTTP服務(wù)頁面時。只有當(dāng)頁面從本地磁盤文件系統(tǒng)打開時,才會考慮file://
..還指定<form accept-charset>
沒有必要,因為它已經(jīng)默認為在為表單服務(wù)HTML頁面時使用的響應(yīng)編碼。
添加回答
舉報