1

この問題は少し奇妙です。私のコードでは、MYSQL と JSP のすべての UTF-8 要件が完全に正当化されています。input.jsp (入力を取得するため) と NewFile.jsp (データベースから入力を取得するため) の 2 つの単純なファイルがあります。データベース QASKU.production は既に作成され、UTF8 データがロードされており、正常に動作しています。問題は、選択ステートメントを介して取得されたデータにありますが、常にではありません。このステートメントを使用する場合

ResultSet rs = stmt.executeQuery("select * from QASKU.production");

すべてのデータが取得され、完全に表示されます。

しかし、これらのステートメントを使用すると:

ResultSet rs = stmt.executeQuery("SELECT * FROM QASKU.production WHERE rhs LIKE '" + sent + "' ORDER BY prob DESC");

また

String query = "select * from QASKU.production WHERE rhs = ?";
PreparedStatement pstmt = con.prepareStatement( query );
pstmt.setString( 1, sent );
ResultSet rs = pstmt.executeQuery( );

データは完全に取得および表示されますが、これはファイル input.jsp からこのファイル NewFile.jsp に与えた入力に依存します。

データベース内のデータは次のようになります。

ADJ|0.001222

ADJ|アラビア語|0.01956

ADJP|ADJ ADJ|0.098214

ADJP |ADJ ADJ.DEG|0.044643

というわけで、入力値として ADJ を与えたところ、NewFile.jsp 経由で表示される出力は完璧です。

ここで、たとえば、入力値として「اسسٹنٹ」を指定した場合、select ステートメントはデータベースから結果セットをフェッチせず、空のままになります。これは、「اسسٹنٹ」のレコードがデータベースに存在する場合でも問題です。

これは MySQL や JSP の問題ではないと思います。問題はselectステートメント内にあると思いますが、よくわかりません。

私のコードファイルは次のとおりです。

入力.JSP

 <!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>QASKU URDU PARSER</title>

    <script type="text/javascript" >
    var ids = [];
    var blurfocus = function(id){
          document.getElementById(id).onfocus = function(){
        if(!ids[id]){ ids[id] = { id : id, val : this.value, active : false }; }
        if(this.value == ids[id].val){
          this.value = "";
        }
          };
          document.getElementById(id).onblur = function(){
        if(this.value == ""){
          this.value = ids[id].val;
        }
      }
    }

    function checkSubmit(e)
    {
       if(e && e.keyCode == 13)
       {
          document.forms[0].submit();
       }
    }
    </script>

    </head>
    <body>
    <form name="myform" action="NewFile.jsp" method="post" enctype="application/x-www-form-    urlencoded" >

       <div align="center" onKeyPress="return checkSubmit(event)">

    <h4>QASKU URDU PARSER</h4><br>
    <h5>Type sentence using Urdu/Arabic script only and then press the 'Parse' button below</h5><br>

    <textarea cols="100" rows="5" style="text-align: right" name="mytextarea" id="message" >Type here</textarea>
    <script type="text/javascript" >
    blurfocus("message");
    </script>

    <br><br>
    <input type="submit" value="Parse" >

    </div>

    </form>
    </body>
    </html>

次に、次のように 2 番目のファイル NewFile.jsp を作成します。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<!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>
<%
try
{
String sent=request.getParameter("mytextarea");
 out.println(sent);

Statement stmt;
Connection con;
String url = "jdbc:mysql://localhost:3306/";
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url, "root", ""); 
//stmt = con.createStatement();
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
//out.println(con.getMetaData().getDatabaseProductVersion());
//stmt.executeUpdate("DROP DATABASE QASKU");
//out.println("Deleted");
//stmt.executeUpdate("CREATE DATABASE QASKU CHARACTER SET utf8 COLLATE utf8_general_ci");
//stmt.executeUpdate("CREATE TABLE QASKU.production(lhs varchar(50) NOT NULL, rhs varchar(200) NOT NULL, prob double NOT NULL) CHARACTER SET utf8 COLLATE utf8_general_ci");
//stmt.executeUpdate("LOAD DATA LOCAL INFILE '/QAS/JSP/myfirst/WebContent/PCFG.utf' INTO TABLE QASKU.production CHARACTER SET utf8  LINES TERMINATED BY '\r' ");

//ResultSet rs = stmt.executeQuery("SELECT USER(),CHARSET(USER()),COLLATION(USER())");
//ResultSet rs = stmt.executeQuery("select * from QASKU.production");
ResultSet rs = stmt.executeQuery("SELECT * FROM QASKU.production WHERE rhs LIKE '" + sent + "' ORDER BY prob DESC");

//String query = "select * from QASKU.production WHERE rhs = ?";
//PreparedStatement pstmt = con.prepareStatement( query );
//pstmt.setString( 1, sent );
//ResultSet rs = pstmt.executeQuery( );

if(rs != null)
{
%>  
    <table align=center border="1" bgcolor="green" width="75%">
    <col width="25">
    <col width="25">
    <col width="25">
    <tr>
        <th align=left>LHS</th>
        <th align=left>RHS</th>
        <th align=left>PROBABILITIES</th>
    </tr>
<%

    while(rs.next())
    {
        out.println("<tr><td align=left>"+rs.getString(1)+"</td>");
        out.println("<td align=left>"+rs.getString(2)+"</td>");
        out.println("<td align=left>"+rs.getDouble(3)+"</td></tr>");    
    }
}
else
{
    out.println("Result Set is Emptry");
}

%>
    </table>
<%

con.close();
}
catch(Exception e)
{
out.println(e);
}
/*
try
    {
        BufferedReader reader = new BufferedReader(new FileReader("/QAS/JSP/myfirst/WebContent/PCFG.utf"));
        String text = "";
        while ((text = reader.readLine()) != null) 
            {
                out.println(text);
            }
    }
    catch(Exception e)
    {}
 */
%>

</body>
</html>
4

3 に答える 3

0

完全な解決策は、Tomcat の Eclipse でプロジェクトの Servers ディレクトリにある /conf/server.xml ファイルに次の文字列 URIEncoding="UTF-8" を追加することです。その後、すべてのエンコード/デコードが自動的に行われます。短いが完璧なソリューション

<Connector URIEncoding="UTF-8" ...........>

これはこれまでで最高の解決策であり、今は私のために祈っています.

于 2013-03-21T14:02:25.310 に答える
0

最後に、24時間後に問題を解決しました。この問題は、次のような他のステートメントに関連しています。

String sent=request.getParameter("mytextarea");

このステートメントは、post メソッドを介して input.jsp ページから値を取得しています。このステートメントはデフォルトで jsp で使用できることは間違いありませんが、その起源は Java サーブレットです。デフォルトでは、定義された 2 つのメソッド「get」と「post」に応じて、ページから ASCII で値を取得します。したがって、ここでは「post」メソッドが input.jsp で使用されました。これにより、取得される値はサーブレットで異なる形式になります。いくつかのjspチュートリアルで読むことができます。input.jsp と newfile.jsp の 2 つのファイルを 1 つのファイルに埋め込み、次の行からいくつかの情報を削除して、この問題を解決しました。

<form name="myform" action="NewFile.jsp" method="post" enctype="application/x-www-form-urlencoded" >

この単純な形式に変換されます。

<form name="myform" method="get" >

現在、次のステートメントは同じページから直接値を取得しており、データをサーブレットに送信していません。

String sent=request.getParameter("mytextarea");

これは大きな解決策ではありませんが、少なくともウルドゥー語が utf8 文字を意味する場合は完全に機能しています。したがって、最終的な結論は、MySQL から ASCII 値を取得し、MySQL データベースから utf8 値を取得しないというバグは、このステートメントに問題があり、他のステートメントには問題がないということです。

于 2013-03-16T22:24:09.363 に答える