1.字符亂碼出現的原因:
出現亂碼是由於數據在傳遞和接受過程中字符編碼格式不一致導致的。
for examples:
輸入11-->在2進制中代表的是3 -->在8進制中代表的是9 -->在16進制中代表的17
在這里同樣輸入的都是11,但是由於進制的不一樣,所以代表的值也不一樣。
同理,編碼在底層都是一串字節碼,由於編碼格式的不同,比如以UTF-8編碼格式進行編碼,以iso8859-1編碼格式就無法進行解析,所以所展現出來的字符串就不是原先的字符串了。
2.字符亂碼的解決方式
2.1將亂碼先進行編碼,在進行解碼(不管是get請求還是post請求都適用)
String userCount = User.getUserCount(); //將亂碼字符串按照錯誤的編碼格式轉換為原始的字節碼序列 byte[] bs = userCount.getBytes("iso889-1"); //將原始的字節碼序列使用正確的編碼格式進行編碼,轉換為正確的文字 userCount = new String(bs,"utf-8");
2.2使用spring框架構建項目的話可以使用編碼過濾器(post請求方式)
在web.xml中添加:
<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encoding</filter-name> <servlet-name>springmvc</servlet-name> </filter-mapping>
<servlet-name>springmvc</servlet-name>說明只要請求被前端控制器攔截到,就會執行這個名稱為encoding的filter。
CharacterEncodingFilter的源碼如下:
public class CharacterEncodingFilter extends OncePerRequestFilter { /*設置了兩個屬性encoding和forceEncoding,encoding代表的是編碼格式,forceEncoding表示是否啟用*/ private String encoding; private boolean forceEncoding = false; public CharacterEncodingFilter() { } public void setEncoding(String encoding) { this.encoding = encoding; } public void setForceEncoding(boolean forceEncoding) { this.forceEncoding = forceEncoding; } protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { /*當編碼格式不為空以及forceEncoding為true時,那么設置就將服務器端的編碼格式設置為配置文件中設置的編碼格式*/ if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
//只能修改請求體中編碼方式 request.setCharacterEncoding(this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); } }
所以需要在web.xml中設置encoding和forceEncoding的初始化值
<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <servlet-name>springmvc</servlet-name> </filter-mapping>
2.3如果是本地的項目的話,可以在tomcat的配置文件server.xml中修改編碼格式 (get請求)
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
在server.xml配置文件下,添加屬性URIEncoding="UTF-8"