Java Web中数据从前端输入到插入数据库,哪些地方需要考虑字符编码?


目前考虑到的有三个地方需要设置字符编码:

JSP页面:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

JDBC获取连接时:


 DriverManager.getConnection("jdbc:mysql://localhost:3306/developerdb?useUnicode=true&characterEncoding=utf8", "developer", "developer");

数据库:
数据库编码

但最终插入数据库时还是乱码了(正常显示的数据是通过workbench插入的,乱码的是jdbc插入的):

乱码

两个问题:
1. 是不是有一些需要设置字符编码的地方我给忽略了,比如Tomcat,JVM的编码?
2. PHP会有类似的坑吗?

java 字符编码 javaweb

我爱桂言叶 10 years, 2 months ago

如果食用spring,可以通过在web.xml中注册Encoding Filter解决。


 <!-- CharacterEncodingFilter provided by SpringFramework -->
<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>

airisu answered 10 years, 2 months ago

1.jsp文件以及.java文件自身的编码,建议用Notepad++看一下。Eclipse设置中搜索Content Type把.java .jsp的编码改为UTF-8
2. <%@ page language="java" pageEncoding="UTF-8"%>
3.楼主的数据库链接字符串 应该为characterEncoding=UTF-8 而不是utf8。数据库和java中有所不同。传送门:
MySQL官方 mysql-connector-j驱动包字符串详解
4.数据库,以及对应表中相应字段的编码,都要为utf8

当然还可能有jvm虚拟机,tomcat,一般情况下没事……

如果赞同请采纳。如有错误请指出。谢谢。

单身的汪星人 answered 10 years, 2 months ago

问题解决了。
原因应该是出在Tomcat身上。浏览器请求传到Tomcat容器的时候还会经历一次编码转换,而Tomcat7.0对请求的默认编码字符集是ISO8859-1(还没找到Tomcat的官方文档来支持这一观点),所以解决方法就是在java代码里对请求再次进行编码转换。其中有两种处理方式:

  1. 对参数值的字符串进行编码转换。
    new String(request.getParameter("name").getByte("ISO-8859-1"),"UTF-8");

  2. 对进入容器的所有请求进行编码转换。这个方式需要配置一个过滤器


 public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding("utf-8");
    chain.doFilter(request, response);
}

特别感谢 @Dont @Honwhy

一方通行的胖次 answered 10 years, 2 months ago

一、如果是mysql的话,安装时如果没有选择编码,则需要修改mysql安装路径下配置文件中的编码。
二、中文的话需要处理decode和encode,js或者后台。

华丽的笨蛋 answered 10 years, 2 months ago

Your Answer