在Centos5.5上使用Tomcat6的JDBC资源池和utf8问题

时间:2011-01-29 13:34:13

标签: tomcat servlets jdbc utf-8 character-encoding

首先:请原谅我的英语。 之后......

我在Centos5.5上有一个Tomcat6服务器,配置了JDBC资源池。

<Resource name="jdbc/BD"
            auth="Container"
            type="javax.sql.DataSource"
            username="user"
            password="pass"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://127.0.0.1:3306/BD?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"
            maxActive="30"
            maxIdle="50"
            maxWait="-1"
            testWhileIdle="true"
            timeBetweenEvictionRunsMillis="300000"
/>

我编写了一个类来建立与该DataSource(名为DAO)的连接;

        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
        DataSource ds = (DataSource) envCtx.lookup("jdbc/BD");
        connexio = ds.getConnection();
        sentencia = connexio.createStatement();

在这里你有我用来抛出查询的代码:

            DAO conn = new DAO();
            ResultSet SQLresults = conn.executeSQL(SQLQuery);

            while (SQLresults.next()) {
                String string1 = SQLresults.getString(2);
                String string2 = SQLresults.getString(3);
                String string2 = SQLresults.getString(4).replaceAll("[\n\r]", " ");
                String string3 = SQLresults.getString(5).replaceAll("[\n\r]", " ");
                String string4 = SQLresults.getString(6).replaceAll("[\n\r]", " ");
            }

我的DDBB(MySQL)默认使用UTF8,我使用“default charset = utf8”创建了所有表格以确保这一点。

和....

我几乎都使用格式良好的UTF8字符编码,但有时候我会遇到一些字符错误。我确定问题出在mysql和tomcat之间(所以在我的servlet或JDBC连接中),因为我在servlet写入之后看到一些格式错误的字符,但它们在MySQL UTF8提示符中的格式良好。我的终端。

例如,在MySQL UTF8终端(Putty,iMac终端,Ubuntu和Debian终端)中,我看到:

  

LG Optimus 2X和Optimus Black亚马逊德国售价499欧元,尚未购买

但是我的servlet写道:

  

LG Optimus 2X和Optimus Black由亚马逊德国定价为-499,尚未购买

当我解码时,“‬”应该是“€”......但事实并非如此。这是糟糕的形式。

其他示例字符,在我的UTF8终端中:

  

David Trueba:“Leer novelas mellevóalguión”:鸣叫RUBÉNDARÍOÁLVARE......

的Servlet

  

David Trueba:“Leer novelas mellevóalguiónâ?:TweetRUBÃ?NDARÃOÃLVARE......

但是“â??”,“â”,“Ã?”应该是“”É(在解码之后)但是它们是被破坏的UTF8字符,我不知道为什么因为85%的UTF8字符被完美解码。你可以看到:óÍÁ因为它们完全是格式良好的。

你怎么看待它?如果它有帮助,我将UTF8文本发送到Android设备,当有一个格式错误的UTF8字符时,我明白了。

BTW我使用这个页面来确定好的UTF8文本:

http://www.cafewebmaster.com/online_tools/utf_decode

......它证实了形成良好和形成不良的角色。

啊!,并且servlet在浏览器中写入文本(没有html语句,只有文本),但我一直在做一些测试,如果我将它转换为html页面并将错误形成的数据放入正文并强迫他们使用:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >

结果是一样的。

非常感谢你!

1 个答案:

答案 0 :(得分:0)

我发现至少有两个(潜在的)问题。首先,在JDBC URL中,您使用了useEncoding参数,而MySQL JDBC驱动程序未正式识别此参数。它应该被称为useUnicode

然后是servlet响应部分。它默认使用平台默认字符编码,它本身不是UTF-8。您需要在之前将servlet响应的字符编码显式设置为UTF-8以及。由于您不使用JSP,因此您还需要手动设置内容类型。

resposne.setContentType("text/plain; charset=UTF-8");
resposne.setCharacterEncoding("UTF-8");

在<{1}}或getWriter()上第一次来电之前

另见:


当内容通过HTTP传输时,请注意您的问题中提供的元标记忽略。相反,HTTP响应getOutputStream()标头将用于确定内容类型和字符编码。您可以在 Net 面板中确定HTTP标头,例如Firebug

alt text