JDBC 用的是 UniCode 编码,需要转换进行字符集的转换.

解决方案 »

  1.   

    oracle的存储也是用Unicode!
    但是如何做转化呢,我在网上找了一些办法都不可以的!
    请问如何转换?
      

  2.   

    两种方法:
    1:修改区域设置:在控制面版中选择区域设置,设为英语(美国)
     然后重起。一切就都正常。 
    2:在编译servlet时加入代码选项。编译servlet使用 
    javac -encoding iso8859_1 myservlet.java 
      

  3.   

    两种方法 :
    1:修改区域设置:在控制面版中选择区域设置,设为英语(美国) 
    然后重起。一切就都正常。 
    2:在编译servlet时加入代码选项。编译servlet使用 
    javac -encoding iso8859_1 myservlet.java 
      

  4.   

    哦,我用的是linux和solaris,不是NT.
    还有,我直接用java写的程序就不能读中文,如果在编译的时间加也是没有用的,
    出来的还是??
    我的程序如下:import java.sql.*;
    import oracle.sql.*;
    import oracle.jdbc.driver.*;
    import java.util.*;class Employee
    {
      public static void main (String args [])
           throws SQLException
      {
        Properties p = new Properties();
        p.put("user","system");
        p.put("password","manager");
    //    p.put("CHARSET","utf8");
        p.put("CHARSET","GBK");
        // Load the Oracle JDBC driver
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());    // Connect to the database
        // You can put a database name after the @ sign in the connection URL.
        Connection conn =
          DriverManager.getConnection ("jdbc:oracle:oci8:@sun", p);
        // Create a Statement
        Statement stmt = conn.createStatement ();
        ResultSet rset = stmt.executeQuery ("select * from users");
    //    int oracleID= CharacterSet.ZHS16GBK_CHARSET;
    //    CharacterSet gb= CharacterSet.make(oracleID);    // Iterate through the result and print the employee names
     //  oracle.sql.CHAR ss;
         String ss1;
            String ss;
        while (rset.next ())
        {
     //     ss=new oracle.sql.CHAR(rset.getString(2),gb);
            ss=rset.getString(2);
            try{
            byte[] b=ss.getBytes();
            ss1= new String(b,"GBK");
            System.out.println(ss1);
            }catch(Exception e){
    //      return(e.getMessage());
            }    }
        // Close the RseultSet
        rset.close();    // Close the Statement
        stmt.close();    // Close the connection
        conn.close();
      }
      public Employee() {}
    }
      

  5.   

    你改区域设置了吗?试一试吧。上面推荐的两种方法我试过,在我这成功了。
    我还看到一种方法,不过没试过。你可以试试。
    在servlet源程序中加入代码变换语句。如 
     try{ 
     out.println(new ( (new String("我爱死你了")).getBytes("GBK"),"ISO8859_1")) 
     } 
     catch( UnsupportedEncodingException e) 
     { 
     ....... 
     } 
      

  6.   

    怎么在linux下改区域设置?还有你第三个方法我不太懂?我直接输出的中文是好的,主要是从oracle中读出来的有问题!
      

  7.   

    对不起,linux我不太会用,不好意思。没法帮你了。我这有一个程序你看看,也许有用。Servlet汉字问题解决办法。
    //要在Linux上编译,JDK1.2,JSWDK1.0.1,
    //时区 US-EASTimport java.lang.*;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*;
    import java.util.*;public class IsItWorking extends HttpServlet {public static final String TITLE = "我们来测试 okokokok!!!!";
    private static Connection conn = null;String native2unicode(String s)
    {
    if(s==null || s.length()==0)
    {
    return null;
    }byte [] buffer = new byte[s.length()];for(int i=0;i<s.length();i++)
    {
    buffer[i] = (byte)s.charAt(i);
    }return new String(buffer);
    }String unicode2native(String s)
    {
    if(s==null || s.length()==0)
    {
    return null;
    }char [] buffer = new char[s.length() * 2];char c;
    int j=0;
    for(int i=0;i<s.length();i++)
    {
    if(s.charAt(i)>=0x100)
    {
    c = s.charAt(i);
    byte [] buf = (""+c).getBytes();
    buffer[j++] = (char)buf[0];
    buffer[j++] = (char)buf[1];
    }
    else
    {
    buffer[j++] = s.charAt(i);
    }
    }return new String(buffer,0,j);
    }public void service (HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    response.setContentType("text/html");
    ServletOutputStream out = response.getOutputStream();
    try
    {
    Class.forName ("oracle.jdbc.driver.OracleDriver");
    }
    catch ( Exception e )
    {
    out.println("Could not establish connection.");
    }out.println("Success Oracle Driver JJJJJJJJJJ<BR>\n");out.println(TITLE);byte [] by = TITLE.getBytes("GB2312");
    String unicode = new String(by,"8859_1");out.println(unicode+"<BR>\n");try
    {
    try
    {
    conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.6:1521:ORCL", "expert","expert");
    }
    catch(SQLException e)
    {
    out.println("Connect Error<BR>\n");
    }out.println("conn successfully");Statement stmt = null;
    try
    {
    stmt = conn.createStatement ();
    }
    catch(SQLException e)
    {
    out.println("STMT Error<BR>\n");
    }ResultSet rset;
    try
    {
    //rset = stmt.executeQuery ("select modulename from modmethodinter");
    /*
    //SQL 语句嵌入汉字处理方法。
    String szSQL = "insert into test values('测试')";String szTemp;// = unicode2native(szSQL);byte [] b = szSQL.getBytes("8859_1");szTemp = new String(b,"GB2312");
    */String szSQL = "select name from test";
    rset = stmt.executeQuery (szSQL);String szOut;
    String szTemp;while(rset.next())
    {
    szTemp = rset.getString("name");
    byte [] b = szTemp.getBytes("GB2312");
    szOut = new String(b,"8859_1");
    out.println(szOut+"<BR>\n");
    }
    rset.close();}
    catch(SQLException e)
    {
    out.println("SQL Execute Error<BR>\n");
    stmt.close();
    conn.close();
    return;
    }stmt.close();
    conn.close();out.println("SQL Execute Successfully<BR>\n");
    }
    catch(Exception e)
    {
    }/*
    // set content type and other response header fields first
    response.setContentType("text/html");ServletOutputStream out_put = response.getOutputStream();
    OutputStreamWriter ow = new OutputStreamWriter(out_put,"8859_1");try
    {
    // byte [] b = TITLE.getBytes("GB2312");
    // String unicode = new String(b,"8859_1");
    //NT out.println(unicode);
    //Linux
    ow.write(TITLE);
    ow.close();
    }
    catch( UnsupportedEncodingException e)
    {
    out_put.println("Error!");
    }
    // write the data
    //stockDb db = new stockDb();
    */
    }
    public void doGet ( HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {response.setContentType("text/html");
    ServletOutputStream out = response.getOutputStream();out.println("Hello World");try
    {
    Class.forName ("oracle.jdbc.driver.OracleDriver");
    }
    catch ( Exception e )
    {
    out.println("Could not establish connection.");
    }out.println("Success Oracle Driver<BR>\n");try
    {
    conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.6:1521:ORCL", "expert","expert");out.println("conn successfully");Statement stmt = conn.createStatement ();// Select the ENAME column from the EMP table
    ResultSet rset = stmt.executeQuery ("insert into test values('测试')");/*
    while(rset.next())
    {
    out.println("TEST");//(rset.getBinaryStream(1));
    }
    */
    rset.close();
    stmt.close();
    conn.close();
    }
    catch(Exception e)
    {
    }}//doGet
    }