Jcheal_J
2018-07-09 07:04
采纳率: 50%
浏览 2.1k
已采纳

!!!servlet 传数据给数据库出现中文乱码

网上的各种方法我都试过了
什么my.ini,
还有 request.setCharacterEncoding("UTF-8");//处理编码

response.setCharacterEncoding("UTF-8");//处理编码
以及public String handleString(String s) {
try{
byte bb[] =s.getBytes("UTF-8");
s=new String(bb);
}
catch(Exception ee){

        }
        return s; 
}
最后的String uri="jdbc:mysql://127.0.0.1/zbsjk?"+"user=root&password=123456&characterEncoding=utf8";
都解决不了,难道我要重装mysql吗!!!!QUQ
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

18条回答 默认 最新

  • crazydddfz 2018-07-09 08:15
    已采纳

    你说jsp没问题,那我问你你的jsp页面的字符集是UTF-8吗,还有post请求不需要转码的,get请求数据时候才用到你上面的方法,我自己post数据进去都是好的,只要get请求时候才会采用new String(str.getByte("iso-8859-1"),"utf-8");来进行转码

    打赏 评论
  • 蜂居 2018-07-09 07:12

    数据库的my.cnf 里加上 character-set-server=utf8 ,然后重启mysql服务。

    打赏 评论
  • csdn_admin_ 2018-07-09 07:12

    既然不是程序和连接字符串的问题,那就看看是不是mysql的问题;

        查看数据库编码:    
                            show variables like '%char%';
    
        修改字符编码:
                            set global character_set_database=utf8;
                            set global character_set_server=utf8;
                            show variables like '%char%';
    
    打赏 评论
  • apewxkxadt 2018-07-09 07:18

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

    打赏 评论
  • tigerJGG 2018-07-09 07:19

    你的数据传到servlet里面是正常的吗 还是servlet数据正常在传到数据库才乱码的

    打赏 评论
  • qq_40214332 2018-07-09 07:19

    web.xml中的servlet过滤路径是不是写错了 /*

    打赏 评论
  • qq_21372943 2018-07-09 07:27

    后台的数据类型,数据库引擎,数据库类型长度的大小,数据库编码等等都有可能

    打赏 评论
  • qq_37483717 2018-07-09 07:44

    characterEncoding=gb2312 换成这个试试

    打赏 评论
  • Programer Hai 2018-07-09 07:47

    设置项目的编码为utf-8试试

    打赏 评论
  • weixin_37800734 2018-07-09 07:48

    数据库和表的字符集设置了吗?

    打赏 评论
  • CrownClown94 2018-07-09 07:49

    首先你断点看看是不是,java里的数据,传到数据库之前乱码了吗?

    打赏 评论
  • CrownClown94 2018-07-09 07:50

    如果没有没乱,那就是 数据设置的问题,如果乱码了那就是你java程序的问题

    打赏 评论
  • x_ht_ 2018-07-09 07:53

    数据库类型的问题吧?。看一下数据库类型有没有问题。

    打赏 评论
  • Jcheal_J 2018-07-09 07:57
    • package servlet;
    • import flogin.rigister;
    • import java.io.IOException;
    • import java.io.PrintWriter;
    • import java.io.IOException;
    • import java.io.PrintWriter;
    • import java.sql.*;
    • import java.io.*;
    • import javax.servlet.*;
    • import javax.servlet.http.*;
    • import java.util.*;
    • import javax.servlet.ServletException;
    • import javax.servlet.http.HttpServlet;
    • import javax.servlet.http.HttpServletRequest;
    • import javax.servlet.http.HttpServletResponse;
    • public class HandleRegister extends HttpServlet {
    • public void init(ServletConfig config) throws ServletException{
    • super.init(config);

    • try{
    • Class.forName("com.mysql.jdbc.Driver");
    • }
    • catch(Exception e){

    • }
    • }
    • public String handleString(String s) {
    • try{
    • byte bb[] =s.getBytes("iso-8859-1");
    • s=new String(bb);
    • }
    • catch(Exception ee){

    • }
    • return s;
    • }

    • /**
    • * The doGet method of the servlet.
    • *
    • * This method is called when a form has its tag value method equals to get.
    • *
    • * @param request the request send by the client to the server
    • * @param response the response send by the server to the client
    • * @throws ServletException if an error occurred
    • * @throws IOException if an error occurred
    • */
    • public void doGet(HttpServletRequest request, HttpServletResponse response)
    • throws ServletException, IOException {
    • doPost(request,response);
    • }
    • /**
    • * The doPost method of the servlet.
    • *
    • * This method is called when a form has its tag value method equals to post.
    • *
    • * @param request the request send by the client to the server
    • * @param response the response send by the server to the client
    • * @throws ServletException if an error occurred
    • * @throws IOException if an error occurred
    • */
    • public void doPost(HttpServletRequest request, HttpServletResponse response)
    • throws ServletException, IOException {
    • String uri="jdbc:mysql://127.0.0.1/zbsjk?"+"user=root&password=123456&characterEncoding=utf8";
    • Connection con;
    • PreparedStatement sql;
    • rigister userBean=new rigister();
    • request.setAttribute("userBean", userBean);
    • String logid=request.getParameter("id").trim(),
    • pwd=request.getParameter("pwd").trim(),
    • pw2=request.getParameter("pwd2").trim(),
    • phone=request.getParameter("tel").trim(),
    • realname=request.getParameter("realname").trim(),
    • add=request.getParameter("addr1")+request.getParameter("addr2"),
    • skill=request.getParameter("skill"),
    • birth=request.getParameter("birth"),
    • belif=request.getParameter("introduce"),
    • sex=request.getParameter("gender");

    • if(logid==null)
    • logid="";
    • if(pwd==null)
    • pwd="";
    • if(!pwd.equals(pw2)){
    • userBean.setBackNews("两次密码不同。注册失败");
    • RequestDispatcher dispatcher=request.getRequestDispatcher("/Rigister.jsp");
    • dispatcher.forward(request,response);
    • return;
    • }
    • boolean isLD=true;
    • for(int i=0;i<logid.length();i++){
    • char c=logid.charAt(i);
    • if(!((c<'z'&&c>='a')||(c<='Z'&&c>='A')||(c<='9'&&c>='0')))
    • isLD=false; //判断由英文字母+数字组成

    • }
    • boolean boo=logid.length()>0&&pwd.length()>0&&isLD;
    • String backNews;
    • try{
    • con=DriverManager.getConnection(uri);
    • String insertCondition="INSERT INTO J VALUES(?,?,?,?,?,?,?,?,?)";
    • sql=con.prepareStatement(insertCondition);
    • if(boo){
    • sql.setString(1, handleString(logid));
    • sql.setString(2, handleString(realname));
    • sql.setString(3, handleString(pwd));
    • sql.setString(4, handleString(phone));
    • sql.setString(5, handleString(sex));
    • sql.setString(6, handleString(birth));
    • sql.setString(7, handleString(add));
    • sql.setString(8, handleString(belif));
    • sql.setString(9, handleString(skill));
    • int m=sql.executeUpdate();
    • if(m!=0){

    • response.setContentType("text/html;charset=utf-8");
    • PrintWriter out=response.getWriter();
    • out.println("");
    • out.println("注册成功,跳转登陆");
    • out.println(handleString(realname));
    • out.println("");


    • }
    • }
    • else{
    • RequestDispatcher dispatcher=request.getRequestDispatcher("/Rigister.jsp");
    • dispatcher.forward(request,response);
    • backNews="信息填写不完整或名字中有非法字符";
    • userBean.setBackNews(backNews);
    • }
    • con.close();
    • }
    • catch(SQLException exp){
    • response.setContentType("text/html;charset=utf-8");
    • PrintWriter out=response.getWriter();
    • out.println("");
    • out.println(exp);

    • out.println("");

    • }

    • }
    • /**
    • * Initialization of the servlet.
    • *
    • * @throws ServletException if an error occurs
    • */
    • public void init() throws ServletException {
    • // Put your code here
    • }
    • }

    这是我的servlet代码,前面的jsp感觉是没有问题的,我用action method用post

    打赏 评论
  • 试水潜行 2018-07-09 08:44

    传到数据库是出现???,还是乱码,如果是????的话,String uri这里还要加上useUnicode=true

    打赏 评论
  • guanghui9097 2018-07-10 01:49

    应该是数据编码设置出现问题,设置characterEncoding=gb2312 /utf-8

    打赏 评论
  • dsnfkl 2018-07-10 02:23

    数据库在创建表的时候要设置字符集是UTF-8,你可以现在数据库里面直接添加记录看看是不是能添加进去汉字

    打赏 评论
  • 三界众生 2018-07-10 04:28

    最后一种方式是对的,不过,写法不是这样的,先检查你的Servlet的字符设置是否正确; 然后就看MyQL或者Orcle数据库链接操作的地方,写一个characterEncoding=UTF-8;
    而不是在传参的时候写,这样也会很累, 总的来说你写错了位置,去找数据库连接的代码,在后面加上。去吧!

    打赏 评论