整合營銷服務商

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

          免費咨詢熱線:

          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>

          網頁測試


          主站蜘蛛池模板: 狠狠综合久久av一区二区| 亚洲一区二区三区亚瑟| 日韩在线一区视频| 日韩美女视频一区| 日韩在线观看一区二区三区| 一区二区三区亚洲| 日本一区免费电影| 久久久无码一区二区三区| 精彩视频一区二区| 99久久精品国产一区二区成人| 3d动漫精品啪啪一区二区中文| 国产vr一区二区在线观看| 国产精品无码一区二区三区在| 国产成人无码aa精品一区 | 无码少妇一区二区浪潮免费| 国产av成人一区二区三区| 无码一区二区三区免费视频| 日韩欧美一区二区三区免费观看 | 国产在线视频一区二区三区 | 国产精品99精品一区二区三区| 亚洲一区无码中文字幕| 精品一区二区三区3d动漫| 中文字幕日韩一区二区不卡| 国产精品视频一区二区三区无码| 中文字幕一区二区在线播放| 国产精品成人国产乱一区| 国99精品无码一区二区三区 | 国产一区二区三区不卡AV| 日韩一区二区免费视频| 婷婷亚洲综合一区二区| 日韩有码一区二区| 国产乱码精品一区二区三| 亚洲国产精品成人一区| 夜夜添无码一区二区三区| 亚洲AV无码一区二区二三区软件| 丰满人妻一区二区三区视频53 | 乱码精品一区二区三区| 精品无码国产一区二区三区AV | 在线日产精品一区| 国产精品无码一区二区三区免费| 一区二区三区免费视频播放器|