【发布时间】:2016-02-02 12:19:34
【问题描述】:
这是场景-
- DB2 数据库位于大型机系统 (z/OS) 上
- Web 服务器在 USS(z/OS 的 Unix 部分)上运行,使用 Spring JDBC 运行 Java 代码
- 我们测试的浏览器和客户端程序在Windows 7上运行(默认编码是windows-1252)
我们有一个包含西班牙字符 (ú) 的字符串,它使用 Spring 的 JDBCTemplate 存储在数据库中,因此本质上是 JDBC。
- 当使用 JDBC 客户端(Squirrel,用 Java 编写)进行查询时,它会显示为其他内容 (ú)。
- 当使用示例 JDBC 程序进行查询并将结果打印为字符串时,它会显示为其他内容 (ú)。
- 当使用示例 JDBC 程序查询并将结果打印为 UTF-8 编码字符串 [new String(str, "UTF-8")] 时,它会正确显示 (ú)。
- 使用 -Dfile.encoding=utf-8 以 UTF-8 编码启动 JVM 时,在上述两种情况下,结果都会打印为其他内容 (ú)。
- 运行应用程序前端的浏览器也显示为 ú,但 HTML 的内容标头设置为 UTF-8。
现阶段我有点迷茫,有这些疑问-
- 如果打印 UTF-8 格式的字符串特别有效,为什么 JVM 以 UTF-8 编码启动时不起作用。
- 问题可能实际发生在哪一层,是数据库还是 JVM?
我应该怎么做才能在应用程序级别而不是列级别解决?
任何指针都会有所帮助。
【问题讨论】:
-
您使用的 String 的双参数构造函数将字节数组作为第一个参数。在调用 new String(str, "UTF-8") 之前如何将数据库中的字符串结果转换为字节?
-
@Daniel:我在从数据库中获取的字符串上调用 str.getBytes()。
-
在 JDBC 中你必须指定编码你已经这样做了吗?
-
可能数据库已经坏了。可能是 UTF-8 已写入数据库,但数据库编码设置为不同的值:stackoverflow.com/questions/4790679/…
-
永远不要打电话给
str.getBytes()。永远不要不指定字符编码,除非您希望事情以可怕和神秘的方式中断。