關於程式中亂碼解決方案下:亂碼解決篇
阿新 • • 發佈:2019-01-02
亂碼的種類有三種
* 資料儲存之後的亂碼
* 資料展示過程中的亂碼
* 資料傳遞過程中的亂碼
6、關於資料儲存過程中的亂碼:
* 資料儲存之後的亂碼: 資料最終儲存到資料庫表中的時候,表中的資料有亂碼現象。
* 怎麼解決這個問題呢?
- 先檢視在執行insert語句之前是否是亂碼,如果是亂碼,先解決儲存之前的亂碼問題。
- 執行insert語句之前不是亂碼,儲存之後出現亂碼,那可能是資料庫表本身不支援簡體中文。
7、資料展示過程中的亂碼?
* 伺服器端的程式響應中文到瀏覽器,出現亂碼:
response.setContentType("text/html;charset=UTF-8"); 為什麼編寫UTF-8呢?
out.print("中文");
工作區的編碼方式採用UTF-8,說明這裡的“中文”這兩個字也是採用UTF-8的編碼方式,
這時採用charset=UTF-8的方式響應到瀏覽器上,不會出現亂碼。
工作區的編碼方式採用GBK,說明這裡的“中文”這兩個字也是採用GBK的編碼方式,
應該編寫這樣的程式碼不會出現中文亂碼:
response.setContentType("text/html;charset=GBK");
* 在myeclipse中編寫html檔案,假設工作區現在使用的是UTF-8的編碼方式,並且在html檔案中並沒有編寫:<meta charset="UTF-8">
此時,瀏覽器訪問該html頁面的時候,中文出現亂碼,因為瀏覽器在簡體中文的作業系統當中,瀏覽器預設採用GBK的方式展示HTML頁面。怎麼解決這個問題,包括兩種
方式:
第一種方式:將工作區的字元編碼方式設定為GBK
第二種方式:在HTML檔案當中新增:<meta charset="UTF-8">
8、資料傳遞過程中的亂碼?
* 資料傳遞過程中的亂碼:瀏覽器上的表單中的資料提交給伺服器之後,在伺服器端獲取表單中資料的時候出現中文亂碼問題。
Browser --(傳遞過程中出現亂碼)-> Server
* 為什麼瀏覽器向web伺服器提交中文的時候,在伺服器端獲取到的中文是亂碼呢?
- 瀏覽器向伺服器提交中文的時候,中文是不能直接在網路中傳送的。首先被ISO-8859-1進行編碼,在網路中傳送的是一串經過ISO-8859-1編碼之後的資料,傳送給伺服器端之後,伺服器將這一段ISO-8859-1編碼的資料拿到,但是不知道該這段資料編碼之前是哪個國家的文字,所以無法正常顯示資料。
怎麼解決這個資料傳遞過程中的亂碼問題?
第一種解決方案:萬能解決方案
假設現在在瀏覽器上使用的編碼方式是UTF-8,在表單中編寫了“張三”漢字,此時的“張三”漢字是採用UTF-8的編碼方式。
提交表單會先將UTF-8編碼方式的“張三”轉換成ISO-8859-1編碼方式的“張三”
傳送給伺服器,伺服器接收到之後,先經過"ISO-8859-1"的編碼方式進行“解碼”還原,
還原之後再通過UTF-8的編碼方式進行重新編碼。
String username = request.getParameter("username");
byte[] bytes = username.getBytes("ISO-8859-1"); //解碼
username = new String(bytes,"UTF-8"); //編碼
UTF-8 --> ISO-8859-1 --> UTF-8
以上的UTF-8是可變的,以瀏覽器上使用的編碼方式為準。
第二種解決方案:專門解決POST請求的中文亂碼
另外以上的程式碼只對請求體進行編碼,不對請求行中的資料編碼,所以不能解決GET請求的亂碼問題。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
maxThreads="200"/>
注意:這裡的編碼方式UTF-8也不能隨意編寫,需要和瀏覽器的編碼方式一致。
另外:Connector標籤中可以配置什麼資訊呢?
* 埠號 URI字元編碼方式 執行緒數量 .....
一個web站點的預設埠號是:80埠,80埠在一個url中可以不寫,預設就是80
以上的編寫參考文件:CATALINA_HOME/webapps/docs/config/http.html(我的:E:/tomcat7/webapps/docs/config/http.html)
Tomcat伺服器底層在實現的時候,預設情況下可支援同時200個執行緒併發,WEB伺服器底層為了提高程式的執行效率,一般都提供了執行緒池技術(Thread Pool)。使用者在訪問的時候,實際上不會new執行緒,實際上是在伺服器啟動階段就提前將執行緒new好了,放到執行緒池當中。
9、怎麼保證不出現亂碼?
* 資料儲存之後的亂碼
* 資料展示過程中的亂碼
* 資料傳遞過程中的亂碼
6、關於資料儲存過程中的亂碼:
* 資料儲存之後的亂碼: 資料最終儲存到資料庫表中的時候,表中的資料有亂碼現象。
* 怎麼解決這個問題呢?
- 先檢視在執行insert語句之前是否是亂碼,如果是亂碼,先解決儲存之前的亂碼問題。
- 執行insert語句之前不是亂碼,儲存之後出現亂碼,那可能是資料庫表本身不支援簡體中文。
7、資料展示過程中的亂碼?
* 伺服器端的程式響應中文到瀏覽器,出現亂碼:
response.setContentType("text/html;charset=UTF-8"); 為什麼編寫UTF-8呢?
out.print("中文");
工作區的編碼方式採用UTF-8,說明這裡的“中文”這兩個字也是採用UTF-8的編碼方式,
這時採用charset=UTF-8的方式響應到瀏覽器上,不會出現亂碼。
工作區的編碼方式採用GBK,說明這裡的“中文”這兩個字也是採用GBK的編碼方式,
應該編寫這樣的程式碼不會出現中文亂碼:
response.setContentType("text/html;charset=GBK");
* 在myeclipse中編寫html檔案,假設工作區現在使用的是UTF-8的編碼方式,並且在html檔案中並沒有編寫:<meta charset="UTF-8">
此時,瀏覽器訪問該html頁面的時候,中文出現亂碼,因為瀏覽器在簡體中文的作業系統當中,瀏覽器預設採用GBK的方式展示HTML頁面。怎麼解決這個問題,包括兩種
方式:
第一種方式:將工作區的字元編碼方式設定為GBK
第二種方式:在HTML檔案當中新增:<meta charset="UTF-8">
8、資料傳遞過程中的亂碼?
* 資料傳遞過程中的亂碼:瀏覽器上的表單中的資料提交給伺服器之後,在伺服器端獲取表單中資料的時候出現中文亂碼問題。
Browser --(傳遞過程中出現亂碼)-> Server
* 為什麼瀏覽器向web伺服器提交中文的時候,在伺服器端獲取到的中文是亂碼呢?
- 瀏覽器向伺服器提交中文的時候,中文是不能直接在網路中傳送的。首先被ISO-8859-1進行編碼,在網路中傳送的是一串經過ISO-8859-1編碼之後的資料,傳送給伺服器端之後,伺服器將這一段ISO-8859-1編碼的資料拿到,但是不知道該這段資料編碼之前是哪個國家的文字,所以無法正常顯示資料。
怎麼解決這個資料傳遞過程中的亂碼問題?
第一種解決方案:萬能解決方案
假設現在在瀏覽器上使用的編碼方式是UTF-8,在表單中編寫了“張三”漢字,此時的“張三”漢字是採用UTF-8的編碼方式。
提交表單會先將UTF-8編碼方式的“張三”轉換成ISO-8859-1編碼方式的“張三”
傳送給伺服器,伺服器接收到之後,先經過"ISO-8859-1"的編碼方式進行“解碼”還原,
還原之後再通過UTF-8的編碼方式進行重新編碼。
String username = request.getParameter("username");
byte[] bytes = username.getBytes("ISO-8859-1"); //解碼
username = new String(bytes,"UTF-8"); //編碼
UTF-8 --> ISO-8859-1 --> UTF-8
以上的UTF-8是可變的,以瀏覽器上使用的編碼方式為準。
第二種解決方案:專門解決POST請求的中文亂碼
* 無框架下編寫
request.setCharacterEncoding(????);
??? 這個位置寫什麼:寫瀏覽器的編碼方式。另外以上的程式碼只對請求體進行編碼,不對請求行中的資料編碼,所以不能解決GET請求的亂碼問題。
另外以上程式碼必須在從request物件中獲取資料之前設定有效。
* 框架下編寫
在WEB-INF檔案下配置過濾器
<!-- 表單提交POST中文亂碼解決方案統一字元編碼為UTF-8 --> <filter> <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<url-pattern>/*</url-pattern> 會匹配所有url:路徑型的和字尾型的url(包括/login,*.jsp,*.js和*.html等)</span>
第三種解決方案:專門解決GET請求的中文亂碼
修改CATALINA_HOME/conf/server.xml檔案:<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
maxThreads="200"/>
注意:這裡的編碼方式UTF-8也不能隨意編寫,需要和瀏覽器的編碼方式一致。
另外:Connector標籤中可以配置什麼資訊呢?
* 埠號 URI字元編碼方式 執行緒數量 .....
一個web站點的預設埠號是:80埠,80埠在一個url中可以不寫,預設就是80
以上的編寫參考文件:CATALINA_HOME/webapps/docs/config/http.html(我的:E:/tomcat7/webapps/docs/config/http.html)
Tomcat伺服器底層在實現的時候,預設情況下可支援同時200個執行緒併發,WEB伺服器底層為了提高程式的執行效率,一般都提供了執行緒池技術(Thread Pool)。使用者在訪問的時候,實際上不會new執行緒,實際上是在伺服器啟動階段就提前將執行緒new好了,放到執行緒池當中。
<pre name="code" class="html">import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//不能解決get請求亂碼
//request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
//萬能解決方案,適應GET和POST請求。但是這種解決方案編寫程式碼太多。比較麻煩。
//獲取使用者名稱
String username = request.getParameter("username");
byte[] bytes = username.getBytes("ISO-8859-1");
username = new String(bytes,"UTF-8");
System.out.println(username);
*/
//有效
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
//無效
//request.setCharacterEncoding("UTF-8");
System.out.println(username);
}
}
9、怎麼保證不出現亂碼?
只能說是儘量避免出現亂碼,在專案開發過程中統一採用統一編碼方式,凡是涉及到編碼方式的統一都用UTF-8.
希望對你有幫助,祝你有一個好心情,加油!