2015-02-10 50 views
0

当我用Hibernate获取数据库中的实体时,返回的字符串编码很差。数据库是Oracle 11g。休眠返回错误编码的字符串

例子: 2015.2 Ajout d’un point de contrôle

返回为:

2015.2 Ajout d\u0092un point de contrôle

我在hibernate.cfg.xml中尝试了一些设置:

<property name="hibernate.connection.defaultNChar">true</property> 
<property name="hibernate.connection.useUnicode">true</property> 
<property name="hibernate.connection.CharSet">utf-16</property> 
<property name="hibernate.connection.characterEncoding">utf-16</property> 

但没有成功。

这里是数据库设置:

NLS_CHARACTERSET WE8MSWIN1252 NLS_NCHAR_CHARACTERSET AL16UTF16

包含数据行被描述为VARCHAR2(255个字节)

我能做些什么,以一个正确编码字符串返回给我实体 ?

+0

为什么使用“智能报价”而不是普通报价? – fge 2015-02-10 09:47:23

+0

此数据是由我的系统中引用的另一个用户创建的文件名。我没有权力执行文件名策略。 – madgangmixers 2015-02-10 09:57:19

回答

0

这看起来好像数据在插入数据库之前是不好的。 \u0092不是Unicode中的有效代码点,但它存在于Windows-1252 (CP1252)中。这意味着有人将带有Windows编码的数据插入到数据库中,而不是先将字符转换为适当的Unicode。

这类问题的一个常见来源是当您读取文本文件时未指定编码,或者在将字节编码/解码为字符串时依赖平台默认字符集时。

+0

怎样在Unicode中不是一个有效的代码点? – madgangmixers 2015-02-10 13:36:41

+0

并非每个可能的24位数组合都对应于Unicode中的有效代码点,因为代码页中存在空白。代码页'\ u0080'至'\ u00ff'只列出代码点'\ u0080'至'\ u00a0'的控制字符。所以在Unicode中,'\ u0092'表示不可打印的“PU2”。 http://www.fileformat.info/info/unicode/char/92/index.htm – 2015-02-11 08:04:11