0

我正在编写一个 REST API。我从数据库中获取数据并将其存储在字符串中。然后我将它发送回浏览器,如下所示:

//fetch data from database
String s = ...

// Prepare it for browser
byte[] data = s.getBytes("UTF-8");

// Send it to browser now
out.write(data); // out is an OutputStream received from Jersey through the MessageBodyWriter interface

数据来自一个 UTF8 编码的 postgresql 数据库。数据存储在一个字符变数(5000)中。

当浏览器 (Chrome) 显示字符串时,会出现此错误:

error on line 29 at column 285: Input is not proper UTF-8, indicate encoding !
Bytes: 0x19 0x4C 0x29 0x20

其他浏览器也会出现同样的问题。

以下是发送到浏览器的标头:

200
Content-Type: application/xhtml+xml;charset=UTF-8

总结 这里是数据流的总结

数据库(UTF8)>休眠>对象>getBytes(“UTF-8”)>浏览器

我错过了什么?

4

2 回答 2

3

基于我对一个0x19字符的惊讶,我怀疑您数据库中的数据正在以 UTF-16 格式存储或传输。

给出的字节在 UTF-16 big endian 或 UTF-16 little endian 中都没有给出很好的句子,所以我怀疑在 JDBC 连接器之前存在不正确的转换,这意味着您的 String 已经被不正确的数据污染了。

检查您的 JDBC 连接器、表编码和数据库的任何其他数据连接器。

于 2013-08-14T17:00:37.953 回答
1

问题出在你创建字符串的地方,

String s = ...

因为,Java 中的字符串对象没有编码。

唯一具有编码的是byte[]. 所以如果你需要UTF-8数据,那么你需要一个字节[]。如果您有一个包含意外数据的字符串,那么问题出在某个较早的地方将一些二进制数据错误地转换为字符串(即它使用了错误的编码)......所以不要专注于s.getBytes()部分,而是专注于接收并正确存储字符串。

于 2013-08-14T15:45:11.760 回答