整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

java之学习篇-乱码问题汇总

天突然想到之前的一个项目,是和另一个公司合作,我提供后台,对方写小程序调用我的接口,我本地测试好接口后,是没有问题的,然后部署到对方服务器(windows系统),接着就是出先各种各样的乱码问题,在这里汇总记录下,以便后面学习。

java乱码出现的问题有很多,这里主要记录下tomcat,log4j,mysql,jsp,html,http(get,post请求乱码处理)。常见的问题可能是tomcat,http请求乱码问题了,至于jsp和html的乱码问题就很简单了,相信大家也知道,我也就不多说了,首先来说下tomcat的乱码问题,

一个是程序需要发送http GET请求到服务器,请求的参数中包含了中文字符。程序中参数为UTF-8格式,且经过了UTF-8 URL编码再发送。使用的tomcat服务器,但服务器端后台程序中取到的参数的中文是乱码。

解决办法:修改Tomcat的Server.xml,在Connector标签中加上URLEncoding参数。

<Connector port="8080" maxThreads="150" minSpareThreads="25"
maxSpareThreads="75" enableLookups="false" redirectPort="8443"
acceptCount="100" debug="99" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="UTF-8"/>

另一个是tomcat控制台打印乱码,程序中输出到tomcat控制台的中文信息乱码了,

解决办法:打开文件/tomcat/bin/catalina.bat,然后设置set JAVA_OPTS= 的内容中添加选项-Dfile.encoding=UTF-8即可,当然,我不敢包证,但是我的就是这么处理然后就可以了。

然后是log4j的日志打印乱码,这个乱码也是打印在tomcat控制台的时候乱码,但是日志文件却不会,而且我本地测试的时候打印也不会乱码

而且我配置的也是utf-8,这个曾经让我恼火好久,后面我偶然在一篇博客上发现,说有些服务器你配utf-8是不行的,他的是编码就是GBK,我就权当试试,没想到还真是这个问题,这也是让我很无语,,,,

然后就是http请求的乱码,我这个乱码问题是我在shiro判断是否登录的时候,因为我是前后端分离,所以我shiro判断未登录的时候,是返回状态码和提示信息,而不是跳转登录页面,我用response返回中文提示信息是,结果返回的是乱码,可是我明明设置了

res.setCharacterEncoding("utf-8");

可是到前端页面的时候还是乱码了,这让我很费解,后面我仔细想了下,我服务端是设置了返回utf-8的编码,但是浏览器是用utf-8去解析的吗?后面去查了下还要加一条配置,

res.setContentType("text/html;charset=utf-8");

之前知道有这个配置,但是一直不知道有什么区别,今天算是明白了一点,这个就是告诉浏览器,你要用什么编码去解析这个数据。

最后一个是mysql 中文的乱码了,这个着实让我烦恼了好久,我去网上查了,说建表的时候要设置utf-8的编码,可是我在新建数据库的时候就设置了默认就是utf-8的编码,然后我说要配置数据库的默认编码,修改mysql配置文件/etc/my.cnf。

[mysqld]
character-set-server=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

我设置好这个以后,终于不会乱了,但是,,保存进去的中文居然全部变成了???号,于是又去奔波了,

通过这个命令,我们可以看到,我们服务端居然还不是utf-8???

这让我很伤,终于,寻的良方,

只要在数据库properties文件的连接信息里加两个参数

?useUnicode=true&characterEncoding=utf-8

就可以了,唉,真是一波三折啊,

真是与服务器斗,其乐无穷;与数据库斗,其乐无穷;与浏览器斗,其乐无穷啊

文乱码问题是比较常见和烦人的问题,本文通过一个小程序介绍了如何通过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);

...

时为了在文档中插入其他内容,我们一般会将内容导出成网页后再以超链接的形式添加,但有时将PDF转成HTML网页后,原来文档中的表格排版却全乱了是怎么回事?

比如下图所示,原文档是一个简单的含表格的PDF文档,转出来HTML后却成了每行一个字,排版乱的没法看:

那么如何有效避免这种情况并完整的将PDF文档转成一样的网页呢?

首先用极速PDF编辑器打开PDF文档,接着选择工具栏中的“超链接工具”并按住鼠标左键选中表格区域;

然后在弹出的“链接属性”窗口中的“类型”下拉选项中选择“表格框”,并根据文档内容设置应用页面范围后,点击“确定”即可。

回到文档页面可以看到框选的表格区域出现蓝色的超链接标识,这时就已经做好了,接下来验证下效果。

先选择工具栏中的“手形工具”后,在文档处右击选择“导出”—“页面为”

接着根据页面提示设置要导出为HTML网页的页面范围后,点击右侧的确定即可。

这时再次打卡导出的网页可以看到表格被完整且保留原格式导出。