Java不会通过JNDI数据源在MySQL中编写UTF8字符

时间:2014-09-29 16:45:06

标签: java mysql encoding utf-8

我已将JNDI配置为使用UTF-8服务器字符集访问MySQL数据库。 我在Tomcat的上下文文件中的JNDI URL为jdbc:mysql://127.0.0.1:3306/my_db?useUnicode=true&characterEncoding=UTF-8" 数据库服务器,数据库及其表都使用本站中的说明设置为utf-8。

通过调试JDBC连接,它似乎使用UTF-8。 但是,在数据库中将一个重要字符写为0x C3 83 C2 A8。 很明显,服务器误将服务器错误解释为0x C3 A8的UTF-8字符串为Latin1,而Latin-1中的0xC3为UTF-8中的0xC3 83,而拉丁文-1中的0xA8类似于UTF中的0xC2 A8 -8。

如果按照Why java strings are not saved as UTF-8 in MYSQL?正确配置了数据库 为什么服务器将输入UTF-8字符串从驱动程序转换为Latin-1然后再转换为UTF-8(我正在使用的数据库和表的编码)。

1 个答案:

答案 0 :(得分:2)

你必须找到来源。

如果您从某些文本,属性或java源代码中获得è,那么您可以尝试将其替换为\u00e8

编辑器(UTF-8)和javac编译器(可能是Windows-1252,即Windows Latin-1)之间的编码不匹配。

.properties必须是ISO-8859-1(Latin-1),如果是UTF-8,你会得到这样的行为。

如果数据输入和Web应用程序,整个链必须是正确的。表单以UTF-8发布,请求参数作为HTTP默认值,ISO-8859-1。再次出现错误。


假设它是属性文件。 Java SE认为它在ISO-8859-1中,但您编写了UTF-8:

特别黑客将是:

String s = bundle.getString("somekey");
byte[] utf8Bytes = s.getBytes(StandardCharsets.ISO_8859_1);
s = new String(utf8Bytes, StandardCharsets.UTF_8);

最好转换为ASCII resp。 ISO-8859-1使用命令行:

native2ascii -encoding UTF-8 INPUT.properties OUTPUT.properties

反转为UTF-8的功能如下:

native2ascii -reverse -encoding UTF-8 INPUT.properties OUTPUT.properties

而不是命令行ant或maven也可以这样做。