【问题标题】:Input is not proper UTF-8, indicate encoding [closed]输入不是正确的 UTF-8,表示编码 [关闭]
【发布时间】:2013-08-14 15:29:41
【问题描述】:

我正在编写一个 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”)>浏览器

我错过了什么?

【问题讨论】:

  • @assylias 如何添加标题?
  • @assylias - utf-8 不需要 bom。
  • 返回浏览器时是否指定了Content-Type header?以及您如何返回该“数据”数组。 (显示更多代码)
  • 你为什么首先向浏览器发送字节[]?您没有类似 HttpServletResponse.getOutputStream.println(s) 的东西,您可以将编码留给其他人吗?
  • @jtahlborn 我更新了我的帖子

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    String s = ...
    

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

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

    【讨论】:

    • 尝试更改用于流式传输数据的过程。也就是说,尝试各种选项:BufferedInputStream(最有可能工作)、DataInputStream(可能工作)、ObjectInputStream(最不可能工作)。
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 2016-02-29
    • 2015-12-26
    • 1970-01-01
    • 2011-01-31
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多