Java 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之上。它首先从提供者获取数据,将其存储在实体中,然后将该实

我有一个数据提供者,它向我发送一些应该用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之上。它首先从提供者获取数据,将其存储在实体中,然后将该实体持久化到数据库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!