【发布时间】:2015-12-07 02:23:39
【问题描述】:
我正在开发一个使用编码为UTF-8 的网站。
服务端采用Java开发,数据库采用Windows-1252编码。
如何正确编码字符,以便它们在数据库查看器和客户端都能正确显示?
编辑
代码如下:
Class.forName("com.pervasive.jdbc.v2.Driver");
Connection conn = DriverManager.getConnection("jdbc:pervasive://XXX.XXX.XXX.XXX/TEST","xxxx", "xxxxx");
Statement stmt = conn.createStatement();
String sql = "INSERT INTO MyTest (COL1, COL2) VALUES (99999, 'Ó 456789 ñÑ; ° - + ( _ . - / \\ & <' )";
stmt.executeUpdate(sql);
数据库查看器显示:? 456789 ??; ? - + ( _ . - / \\ & < 而不是Ó 456789 ñÑ; ° - + ( _ . - / \\ & <
当SELECT被执行时,字符串? 456789 ??; ? - + ( _ . - / \\ & <被检索
【问题讨论】:
-
从个人经验来看,在不遭受某种损失的情况下,没有真正的好方法。一种可能的解决方法是让您的数据在数据库中存储编码的 HTML 实体(例如 © 或 € 用于版权徽标),并期望这些在数据库查看器中显示为这样,同时期望在代码中处理它们在 Java 端,并将它们转换为必要的格式。这很糟糕,但它强调了对符合 Unicode 的数据库技术的需求。
-
@ShotgunNinja 你混淆了 HTML
escaping和字符集byte[]编码,这是完全不同的问题。 -
不,我不是。这里的目标是在两端都有可显示的字符/代码点,如果我理解正确的话,其中一些超出了 Windows-1252 的可表示范围。虽然 Unicode 是为此而设计的,但在最新版本 12 之前的 Pervasive SQL 服务器中不允许使用它,因此我们需要提出一种不同的解决方案,该解决方案可以在 DB 查看器以及 Java 和更高版本中运行网络。非 Windows-1252 表示的代码点的 HTML 实体编码是一种解决方法,而不是此问题的解决方案。
-
我认为问题是由于 Oracle pre-10g 和 Pervasive pre-v12 都没有 decent JDBC 实现来正确处理底层数据令人讨厌的情况(即,由单字节代码页表示,但包含多字节字符,就像我之前的经验一样)。
-
您混淆了
Unicode代码点规范,它不是编码与编码UTF-8、UTF-16和UTF-32和Windows-1252是所有代表相同Unicode代码点的编码映射,但略有不同。某些东西如何显示文本是客户端解释它并显示它的问题,而不是数据的来源。
标签: java database encoding pervasive