输入不正确UTF-8,表示编码

时间:2013-08-14 15:29:42

标签: java hibernate utf-8 character-encoding jersey

我正在编写REST API。我从数据库中获取数据并将其存储在String中。然后我将它发送回浏览器:

//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)> Hibernate>对象> getBytes(“UTF-8”)>浏览器

我错过了什么?

2 个答案:

答案 0 :(得分:2)

基于我对0x19字符的惊讶,我怀疑数据库中的数据是以UTF-16存储或传输的。

给出的字节在UTF-16 big endian或UTF-16 little endian中都没有给出非常好的句子,所以我怀疑在JDBC连接器之前有一个不正确的转换,这意味着你的String已被污染错误数据

检查您的JDBC连接器,表格编码以及数据库的任何其他数据连接器。

答案 1 :(得分:1)

问题在于您创建了字符串

String s = ...

因为,Java中的String对象没有编码。

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