在做一个管理系统的登录界面。为了解决日文无法正常显示的问题,已做了如下处理:数据库统一为UTF-8所有jsp页面前加入如下代码
<%@ page language="java" pageEncoding="UTF-8" %>
<%  response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
%>Tomcat编码改成UTF-8
在server.xml里面增加了URIEncoding="UTF-8" 测试一:test.jsp直接连接mysql,读取,插入均正常
<%@ page language="java" pageEncoding="UTF-8" %>
<%  response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
%>
<%@ page language="java" %><%@ page import="java.sql.*" %>
<%String driverName="org.gjt.mm.mysql.Driver";
String userName="root";
String userPasswd="";
String dbName="itemmanage";
String tableName="user";String url="jdbc:mysql://localhost/itemmanage?user=root&password=&useUnicode=true&characterEncoding=utf-8";
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
String sql="SELECT b.itemID,a.userName,b.borrowDate,b.dueDate FROM user a  join borrowrec b ON (a.userID=b.userID AND b.dueDate<='2011-03-24')";
ResultSet rs = statement.executeQuery(sql);
ResultSetMetaData rmeta = rs.getMetaData();
int numColumns=rmeta.getColumnCount();out.print("name");
out.print("|");
out.print("num");
out.print("<br>");
while(rs.next()) {
out.print( rs.getString(2));
out.print("|");
out.print(rs.getString(1));测试二:login_menu.jsp用户登录后界面<%@ page language="java" pageEncoding="UTF-8" %>
<%  response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
%>
<%@ page language="java" %><%@ page import="java.sql.*" %>
<html>
<head>
<title>Item Management System : User Info </title>
<META NAME="description" CONTENT="">
<META NAME="keywords" CONTENT="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head><body><%
// 登録者情報を表示
//管理者の場合
if((login.getUserType()).equals("admin")) {
out.println("管理者として登録成功!<br>");
out.println("名前: " +staff.getUserName() +"    ユーザID:" +staff.getUserID() +"<br><br>");
此处username的日文显示正常
String query = "";
String errorMsg="";
ResultSet myResultSet = null;
String queryOrder= "";

//今日の日付を取得
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
java.util.Date currentTime = new java.util.Date();
String str_todaydate = formatter.format(currentTime);

// SQL文生成と実行
queryOrder = " ORDER BY itemID ASC ";
query = "SELECT b.itemID,a.userName,b.borrowDate,b.dueDate FROM user a  join borrowrec b ON (a.userID=b.userID AND b.dueDate<='" +str_todaydate +"')" + queryOrder;
   try {  
       Connection connection = connectionPool.getConnection();
myResultSet = DatabaseUtilities.getQueryResultSet(connection, query, false);                                        
       connectionPool.free(connection);
     } catch(Exception e) {
       errorMsg = "Error: " + e;    
     }
    
     //返還予定日は今日以前の設備と借り手を一覧
     if (myResultSet != null){
int rowCount = 1 ; // set counter to separate even or odd
try{
out.println ("返還予定日は今日以前の設備と借用者は以下のようです。<br>");
out.println ("<table><tr><th>設備番号</th><th>名前</th><th>貸出日</th><th>返還予定日</th></tr>");
while(myResultSet.next()) {
out.println("<TR><TD>" +myResultSet.getString("itemID"));
out.println("</TD><TD>" +myResultSet.getString("userName"));
                                        此处的username日文显示不正常
out.println("</TD><TD>" +myResultSet.getString("borrowDate"));
out.println("</TD><TD>" +myResultSet.getString("dueDate"));
out.println("</TD></TR>");
rowCount = rowCount+1;

}
out.println (" </table >");
} catch(SQLException sqle) {
System.err.println("Error connecting: " +sqle);
    }
}
       
}login.jsp
<%@ page language="java" pageEncoding="UTF-8" %><%  response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
%>
<%@ include file="../common/common.jsp" %>
<%  response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cahce");
%>
<html>
<head>
<title>Item Management System : Login</title>
<META NAME="description" CONTENT="">
<META NAME="keywords" CONTENT="">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
<!--
   A:link                  { text-decoration:  none; font-weight: bold; color: #660033}
   A:active                { text-decoration:  none; font-weight: bold; color: #660033}
   A:visited               { text-decoration:  none; font-weight: bold; color: #336699}
   A:hover                 { text-decoration:  underline; font-weight: bold; color: #FF9999}
.footerLink {  font-family: Arial, Helvetica, sans-serif; font-size: 9pt; font-weight: bold; color: #000099}
-->
</style>
</head><body bgcolor="" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="">
<a name="top"></a> <%

// ログイン状態をチェック、まだログインしていないんら、ログイン画面へ
if (login.isUserLogin()) { %>
<% out.println("貴方は既にログインしましたよ。ユーザID:<b>"); %> <jsp:getProperty name="login" property="userID" />
<% out.println("</b><br>ログアウトして宜しいですか。"); %>
<form name="frmLogout" action="/IM/LogoutProcess" method="post"">
     <input type="submit" name="Submit" value="ログアウト">
    </form>
<% } else { %>
ユーザーIDとパスワードを入力して下さい。
  <form name=login action="/IM/LoginProcess" method="post">
    
    <table width=225 border=0 cellpadding=3>
      <tr>
        <td colspan=2>
          <center>
            
          </center>
        </td>
      </tr>
      <tr>
        <td>ユーザーID:</td>
        <td>
          <input type=text name=loginname>
        </td>
      </tr>
      <tr>
        <td>パスワード:</td>
        <td>
          <input type=password name=password>
        </td>
      </tr>
      <tr>
        <td colspan=2 align=center>
          <input type=submit value="ログイン" name="Submit">
        </td>
      </tr>
    </table>
  </form>
<% } %>
</center>
如果需要看servlet,我会在跟帖补上,在线等解答,请高手不吝赐教啊!

解决方案 »

  1.   

    我也碰到过,在jsp里面这样写试下
    <%=new String((myResultSet.getString("userName")).getBytes("ISO-8859-1"), "utf-8")%>
      

  2.   

    回ls,用户类型的一种,admin时是staff。写在类里,作为servletLoginProcess.java public void doGet(HttpServletRequest request,
                          HttpServletResponse response)
       throws ServletException, IOException {

    loginName=request.getParameter("loginname");
    loginPassword = request.getParameter("password"); 

         String errorMsg;
         //String table;
         try {
           query = "SELECT * FROM user where userID = '" +loginName +"' and userPassword = '"  +loginPassword +"'";      
           Connection connection = connectionPool.getConnection();
           //DBResults results = DatabaseUtilities.getQueryResults(connection, query, false);
    myResultSet = DatabaseUtilities.getQueryResultSet(connection, query, false);                                            
           connectionPool.free(connection);
           //table = results.toHTMLTable("#FFAD00");
         } catch(Exception e) {
           errorMsg = "Error: " + e;    
         }                   
            
            resetVariable();
                          
         if (myResultSet != null){
    try{
    while(myResultSet.next()) {
    userRecNumber = Integer.parseInt(myResultSet.getString("userRecNumber"));
    userID = myResultSet.getString("userID");
    userPassword = myResultSet.getString("userPassword");
    userName = myResultSet.getString("userName");
    userType = myResultSet.getString("userType");
    userGender = myResultSet.getString("userGender");
    /* userEmail = myResultSet.getString("userEmail");
    userICNumber = myResultSet.getString("userICNumber");
    userAddress1 = myResultSet.getString("userAddress1");
    userAddress2 = myResultSet.getString("userAddress2");
    userCity = myResultSet.getString("userCity");
    userState = myResultSet.getString("userState");
    userPostCode = myResultSet.getString("userPostCode");
    userCountry = myResultSet.getString("userCountry");
    userOccupation = myResultSet.getString("userOccupation"); 
    userContactNumber = myResultSet.getString("userContactNumber");
    userTotQuota = Integer.parseInt(myResultSet.getString("userTotQuota"));
    userQuotaAvailable = Integer.parseInt(myResultSet.getString("userQuotaAvailable"));
    userTotReservation = Integer.parseInt(myResultSet.getString("userTotReservation"));
    userReserveAvailable = Integer.parseInt(myResultSet.getString("userReserveAvailable")); */
    }
    } catch(SQLException sqle) {
    System.err.println("Error connecting: " +sqle);
    }


      
    if (userID != ""){ HttpSession session = request.getSession(true);

    Login login = new Login(true, userID, userType);
    session.setAttribute("login", login);

    if( userType.equals("admin"))
    {
    User staff = new User(userRecNumber, userID, userPassword, userType, userName, userGender);
    session.setAttribute("staff", staff);

    } else {
    User user = new User(userRecNumber, userID, userPassword, userType, userName, userGender);
    session.setAttribute("user", user);
    }
      

  3.   

    我想了一下,其实问题就是
    1.通过post方法,调用servlet,操作数据库,再返回到页面的日文显示正常;
    2.在jsp页面调用servlet,读取和插入日文就不正常。1里面流程如下
    login.jsp
     <form name=login action="/IM/LoginProcess" method="post">
        ...
              <input type=submit value="ログイン" name="Submit">login_menu.jsp
    if((login.getUserType()).equals("admin")) {
    out.println("管理者として登録成功!<br>");
    out.println("名前: " +staff.getUserName() +"    ユーザID:" +staff.getUserID() +"<br><br>");LoginProcess代码如4楼

    2在login_menu.jsp中也是同样的

    queryOrder = " ORDER BY itemID ASC ";
    query = "SELECT b.itemID,a.userName,b.borrowDate,b.dueDate FROM user a join borrowrec b ON (a.userID=b.userID AND b.dueDate<='" +str_todaydate +"')" + queryOrder;
      try {  
      Connection connection = connectionPool.getConnection();
    myResultSet = DatabaseUtilities.getQueryResultSet(connection, query, false);  
      connectionPool.free(connection);
      } catch(Exception e) {
      errorMsg = "Error: " + e;
      }

    结果就乱码
    顶楼的测试一中,不使用servlet,也可以显示正常
      

  4.   

    1、你的Java源文件代码格式最好是UTF-8格式的
    2、然后在mysql.ini中配置的MySql的服务器端编码用UTF8,Mysql客户端也用UTF8(可能是这个原因)
    3、你现在所有页面都已经用了UTF8格式
    4、再注意下request.setCharacterEncoding("utf-8");表示所有接受的参数以UTF8保存就可以了。
    String url="jdbc:mysql://localhost/itemmanage?user=root&password=&useUnicode=true&characterEncoding=utf-8"; 
    这个也是关键好像是utf8不是Utf-8,改成
    jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF8&mysqlEncoding=utf8&zeroDateTimeBehavior=convertToNull再试试。
    这样就都不需要用getBytes进行转译都会直接正常的。