首先:请原谅我的英语。 之后......
我在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&useEncoding=true&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" >
结果是一样的。
非常感谢你!
答案 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}}或 当内容通过HTTP传输时,请注意您的问题中提供的元标记忽略。相反,HTTP响应 getWriter()
上第一次来电之前
另见:
getOutputStream()
标头将用于确定内容类型和字符编码。您可以在 Net 面板中确定HTTP标头,例如Firebug。