Java UTF-8-我不理解这个字节序列
我有一个数据提供者,它向我发送一些应该用UTF-8编码的数据。此数据表示此字节序列:Java UTF-8-我不理解这个字节序列,java,hibernate,utf-8,nclob,Java,Hibernate,Utf 8,Nclob,我有一个数据提供者,它向我发送一些应该用UTF-8编码的数据。此数据表示此字节序列: 28 49 4e 54 e2 80 99 4c 29 20 (INT’L) => "(INT’L)" 出于某种原因,当我的java程序获取此数据并将其存储在数据库中时,上述顺序变为: 28 49 4e 54 19 4c 29 20 (INT.L) => "(INT\u0019L)" java程序构建在hibernate之上。它首先从提供者获取数据,将其存储在实体中,然后将该实
28 49 4e 54 e2 80 99 4c 29 20 (INT’L) => "(INT’L)"
出于某种原因,当我的java程序获取此数据并将其存储在数据库中时,上述顺序变为:
28 49 4e 54 19 4c 29 20 (INT.L) => "(INT\u0019L)"
java程序构建在hibernate之上。它首先从提供者获取数据,将其存储在实体中,然后将该实体持久化到数据库Postgresql中
为什么我丢失了E28099变为19的字节?
我怎样才能避免这种情况
以下是用于将从提供程序获取的数据传输到实体的核心方法:
import java.sql.Clob;
//...
public static String convertStreamToString(Clob clob) throws SQLException {
if (clob == null) {
return "";
}
BufferedReader br = null;
StringBuilder result = new StringBuilder();
try {
br = new BufferedReader(new InputStreamReader(clob.getAsciiStream(), Charset.forName("UTF-8")));
String lig;
int n = 0;
while ((lig = br.readLine()) != null) {
if (n > 0) {
result.append("\n");
}
result.append(lig);
n++;
}
} catch (IOException ioe) {
// Exception handling code ...
} catch (SQLException sqlex) {
// Exception handling code ...
} finally {
IOUtil.close(br);
}
return result.toString();
}
// ...
MyEntity entity = ...
oracle.sql.NCLOB clob = ...
entity.setProperty(convertStreamToString(clob));
@Entity
class MyEntity {
@Column(name="prop", length=100000)
private String prop;
public void setProperty(String value) {
this.prop=value;
}
}
我认为DB列类型应该支持UTF-8。在Oracle中这是NVARCHAR,在Postgresql中是这样的
create table test (
utf8fld varchar(50)
);
我认为DB列类型应该支持UTF-8。在Oracle中这是NVARCHAR,在Postgresql中是这样的
create table test (
utf8fld varchar(50)
);
您正在使用GetAsciStream读取CLOB的内容。顾名思义,此方法仅适用于ASCII;它会打断所有非ASCII字符
改用这个方法
BufferedReader br = null;
StringBuilder result = new StringBuilder();
try {
br = new BufferedReader(clob.getCharacterStream());
....
您正在使用GetAsciStream读取CLOB的内容。顾名思义,此方法仅适用于ASCII;它会打断所有非ASCII字符
改用这个方法
BufferedReader br = null;
StringBuilder result = new StringBuilder();
try {
br = new BufferedReader(clob.getCharacterStream());
....
你能给我们看一下代码吗?@BrianAgnew所有的工作都是由Hibernate完成的……我想看看你是如何从提供者那里接收数据的,以及你是如何将数据输入HibernateSome组件的,你已经从字符中去掉了高位字节:你希望得到\u2019而不是\u0019。至于造成这种情况的原因,我们需要更多地了解数据是如何放入数据库的,以及如何将其重新取出的。我很有信心Hibernate不是问题除非你能提供更多细节,除了一般猜测之外,你不太可能得到任何东西。你能给我们看一下代码吗?@BrianAgnew所有的工作都是由Hibernate完成的……我想看看你是如何从提供者那里接收数据的,以及你是如何将数据输入Hibernate的一个组件,你已经从字符中去掉了高位字节:你希望得到\u2019而不是\u0019。至于造成这种情况的原因,我们需要更多地了解数据是如何放入数据库的,以及如何将其重新取出的。我很有信心Hibernate不是问题。除非您能提供更多详细信息,否则您不太可能得到除一般猜测以外的任何信息。数据来自Oracle数据库,存储为NCLOB。此数据作为字符变量存储在Postgresql中。有影响吗?我的意思是,如果你有VARCHAR或CLOB列,并且你写了一个Unicode字符,比如Ё,它可能会被扭曲,而NVARCHAR或NCLOB可以存储任何字符。数据来自Oracle数据库,在那里它被存储为NCLOB。此数据作为字符变量存储在Postgresql中。有什么影响吗?我的意思是,如果你有VARCHAR或CLOB列,并且你写了一个Unicode字符,比如Ё,它可能会被扭曲,而NVARCHAR或NCLOB可以存储任何字符。我必须承认,问题来自我们的解决方法。。。但是这个解决方法来自于一个Hibernate bug!我必须承认问题来自我们的解决方案。。。但是这个解决方法来自于一个Hibernate bug!