整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          tomcat8.5+ windows中html頁面及控制臺中文亂碼問題解決辦法

          幾天有OMI的用戶反映,安裝OMI時有中文亂碼現象,我還說不可能。我們的程序在windows,linux都部署過無數次了,開發時都是UTF8編碼的,咋還會亂碼呢。結果看了半天也沒看出個啥,還是沒解決。

          最近新安裝程序時,新下載了一個tomcat8.5的版本,一跑程序還真是html頁亂碼了,但JSP頁沒事。因為之前我們的程序都是跑在tomcat7,最高是tomcat8.0,沒試過更高的,高版本確實有問題,且控制臺中文也是亂碼。

          一、嘗試了一些網友給的辦法,下面說一下解決方案:

          1、tomcat\bin\catalina.bat 中添加,

          set JAVA_OPTS=-Xms512m -Xms1024m -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8

          我的添加位置如圖

          ?前面是正好順便設置了JVM的內存,解決問題的主要后面的部分。

          2、修改tomcat\conf\server.xml,加入 URIEncoding="UTF-8"

          加入如圖位置

          ?好象是第一步就可以了,保險起見第二步也加上吧 。

          二、關于控制臺亂碼解決辦法:

          修改tomcat\conf\logging.properties

          #java.util.logging.ConsoleHandler.encoding = UTF-8(GBK)

          將UTF-8改為GBK,或者把整行注掉

          我是把相關編碼全注了

          以上,如未解決問題可以加QQ群交流,群名:Kettle實戰。

          文亂碼問題是比較常見和煩人的問題,本文通過一個小程序介紹了如何通過Servlet從上一個頁面獲取參數,

          方法很簡單:調用request.getParameter(String s)方法。

          解決中文亂碼問題的方法是:

          首先要設置response響應的格式:response.setContextType("text/html;charSet=GBK");

          然后在加上request.setCharacterEncoding("GBK")

          需要注意的是這是解決post方式提交的內容的中文亂碼問題。

          解決get方式提交內容的中文亂碼問題的方法:

          在Tomcat->conf文件夾->server.xml-->connecter標簽里加上:

          URIEncoding="GBK"(注意:在xml里面“=”兩邊不要有空格)

          關于Post和Get之間的區別可以看我轉載的另一篇博文:

          HTTP POST GET 本質區別詳解

          例子:

          1.threeparams.html


          1. <html>
          2. <body>
          3. <form method="post" action="Threeparams">
          4. <table>
          5. <tr>
          6. <td>
          7. param1
          8. </td>
          9. <td>
          10. <input name="p1" type="text"/>
          11. </td>
          12. </tr>
          13. <tr>
          14. <td>
          15. param2
          16. </td>
          17. <td><input name="p2" type="text"/>
          18. </td>
          19. </tr>
          20. <tr>
          21. <td>
          22. param3
          23. </td>
          24. <td><input name="p3" type="text"/>
          25. </td>
          26. </tr>
          27. <td><input type="submit" value="submit">
          28. </td>
          29. </tr>
          30. </table>
          31. </form>
          32. </body>
          33. </html>

          2.ThreeParams.java


          1. import java.io.*;
          2. import javax.servlet.ServletException;
          3. import javax.servlet.http.*;
          4. public class ThreeParams extends HttpServlet{
          5. @Override
          6. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
          7. throws ServletException, IOException {
          8. doPost(req,resp);
          9. }
          10. @Override
          11. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
          12. throws ServletException, IOException {
          13. resp.setContentType("text/html;charset=GBK");
          14. //解決post方式提交內容的中文亂碼
          15. //一定要卸載存取第一個參數之前
          16. //不要調用resp.setCharacterEncoding("GBK");
          17. req.setCharacterEncoding("GBK");
          18. //解決get方式亂碼問題:修改server.xml中的connector標簽-->URIEncoding="GBK"
          19. PrintWriter out = resp.getWriter();
          20. out.println(req.getParameter("p1"));
          21. out.println("</br>");
          22. out.println(req.getParameter("p2"));
          23. out.println("</br>");
          24. out.println(req.getParameter("p3"));
          25. out.println("</br>");
          26. }
          27. }

          補充:

          上面的這個例子.html中每個name都不一樣,如果有多個一樣的name時,可以按如下的方法來獲取:

          1)Enumeration paramNames = request.getParameterNames()

          調用此方法獲得所有參數的名字,返回一個Enumeration

          2) while(paramNames.hasMoreElements()){

          String paramName = (String)paramNames.nextElement();

          String[] paramValues = request.getParameterValues(paramName);

          ...

          開發過程中,經常遇到中文亂碼問題,以前總是解決就好,并沒有對該問題總結一下,現在來總結一下開發過程中常見的中文亂碼問題。

          一、有必要了解一些基本的編碼知識:

          • 這篇字符編碼筆記是必讀的

          • jsp的三次編碼

            第一階段:JVM將.jsp文件編譯為.java文件。JVM先讀取pageEncoding的值,根據該值去讀取.jsp文件,然后由指定的編碼方案生成UTF-8的.java文件。

            第二階段:JVM將.java文件轉換為.class文件,從UTF-8至UTF-8。這個過程就與任何編碼的設置都沒有關系了,經過這個階段后.java文件就轉換成了統一的UTF-8編碼的.class文件了。

            第三階段:服務器將處理的結果返回給瀏覽器,這個階段則依靠contentType的charset,如果設置了charset則瀏覽器就會使用指定的編碼格式進行解碼,否則采用默認的ISO-8859-1編碼格式進行解碼處理。

          • jsp中的編碼設置

          1. pageEncoding:<%@ page pageEncoding=”UTF-8”%>

            上文中第一階段,使用該值去讀取jsp文件,為避免中文亂碼,跟jsp文件編碼一致;對服務器響應進行重新編碼,即jsp的輸出流在瀏覽器中顯示的編碼(不是主要作用)。

          2. contentType: <%@ page contentType=”text/html;charset=UTF-8”%>

            使用該值對服務器響應進行重新編碼,即jsp的輸出流在瀏覽器中顯示的編碼;對表單get和post請求數據編碼;上文中第一階段,使用該值去讀取jsp文件(不是主要作用)。

          3. < META http-equiv=”Content-Type” content=”text/html;charset=UTF-8”>

            網頁的編碼信息 ,說明頁面制作所使用的編碼。

          4. request.setCharacterEncoding()

            可用在servlet和jsp頁面中,作用是設置對客戶端請求進行重新編碼的編碼,即post方式提交的數據進行編碼。

          5. response.setCharacterEncoding()

            與<%@ page contentType=”text/html;charset=UTF-8”%>一樣。

          6. response.setContentType()

            與<%@ page contentType=”text/html;charset=UTF-8”%>一樣。

          7. response.setHeader(“Content-Type”,”text/html;charset=UTF-8”)

            與< META http-equiv=”Content-Type” content=”text/html; charset=UTF-8”>一樣。

            注意:上文1,2,3中有部分功能是一樣的,是有優先級的,在讀取jsp文件時,1>2;在對服務器響應進行編碼的時候,2>1>3,一般情況下,1,2都寫。

        1. http請求默認以”ISO-8859-1”的編碼來傳送URL的。

        2. 二、中文亂碼的幾種情況及最簡單的解決方案:

          • pageEncoding設置錯誤

            pageEncoding設置為jsp文件的編碼類型。

          • 查詢字符串包含中文

            中文的編碼方式取決于瀏覽器,chrome為UTF-8,IE為GB2312,這是由于瀏覽器并沒有遵循URI編碼規范。有兩種解決方法:

          1. 開發過程中,將查詢字符串提前編碼,

            如:http://www.baidu.com/demo?demo=%D6%D0%B9%FA (UTF-8編碼)

          2. 在Servlet的doGet()方法中添加

          1
          String value = new String(request.getParameter("parameterName").getBytes("ISO-8859-1"),"瀏覽器的編碼方式");
          • 表單中的get和post數據包含中文

            中文的編碼方式取決于上文的contentType中的charset,有兩種解決辦法:

          1. 在Servlet的doPost()方法中添加request.setCharacterEncoding(“charset的值”);(僅對post有用)

          2. 在Servlet的doPost()方法中添加

          1
          String value = new String(request.getParameter("parameterName").getBytes("ISO-8859-1"),"charset的值");

          三、原理

          我們通過上面的方法可以解決亂碼問題,下面講講原理:

          • 客戶端發到服務器的數據需要在客戶端進行編碼,類似于:String parameterName = "中國".getBytes("UTF-8")然后將編碼后的數據發到服務器。

          • 客戶端接受數據,request.getParameter(“”)的作用就是對接收到的數據進行解碼,默認使用ISO-8859-1進行解碼,可以使用request.setCharacterEncoding(“”)進行設置,但僅對post有用。假如我們使用默認的ISO-8859-1,肯定亂碼,因為編碼跟解碼不一致,那此時怎么辦呢,引出了上文中的兩種解決方案:使用request.setCharacterEncoding(“”)改變request.getParameter(“”)的解碼方式或者new String(request.getParameter("parameterName").getBytes("ISO-8859-1"),"charset的值")將request.getParameter(“”)解碼的數據重新編碼再解碼。

          四、其他

          在jsp中的頁面使用response.setContentType()等設置字符集會破壞jsp容器自身的頁面編碼,會引起html中字符亂碼,腳本不會亂,所以不建議設置。在開發中多采用page指令設置字符集。

          1234567891011121314151617
          <%	response.setContentType("text/html;charset=UTF-8");	String str = new String("你好".getBytes("iso-8859-1"),"utf-8");%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><p>你好</p><br><%=str %></body></html>

          網頁測試


          主站蜘蛛池模板: 免费看一区二区三区四区| 国产亚洲一区二区精品| 国产午夜精品免费一区二区三区| 国99精品无码一区二区三区| 精品理论片一区二区三区| 日本免费一区二区在线观看| 欧洲精品无码一区二区三区在线播放| 成人精品一区久久久久| 无码丰满熟妇一区二区| 农村乱人伦一区二区| 日本免费电影一区二区| 久久国产午夜精品一区二区三区| 国产亚洲福利一区二区免费看| 亚洲香蕉久久一区二区三区四区| 在线视频一区二区三区三区不卡| 亚洲福利精品一区二区三区| 国产一区二区在线|播放| 国产乱码精品一区二区三区| 日韩中文字幕精品免费一区| 成人中文字幕一区二区三区| 亚洲va乱码一区二区三区| 亚洲高清一区二区三区| 国内自拍视频一区二区三区 | 国产午夜一区二区在线观看| 无码少妇丰满熟妇一区二区| 亚洲爆乳精品无码一区二区| 亚洲一区二区三区国产精华液| 中文字幕av日韩精品一区二区| 国产一区二区三区韩国女主播| 99热门精品一区二区三区无码 | 精品久久一区二区| 国产精品日本一区二区不卡视频| 中文字幕Av一区乱码| 日韩一区二区三区无码影院| 无码人妻精品一区二区三区蜜桃| 成人欧美一区二区三区在线视频| 国产在线步兵一区二区三区| 亚洲免费一区二区| 一区二区三区视频在线观看| 亚洲一区二区三区久久| 国产成人综合亚洲一区|