我已将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(我正在使用的数据库和表的编码)。
答案 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也可以这样做。