2017-09-30 1 views
1

J'ai une colonne de base de données de type de données clob et il contient un fichier avec le texte anglais et chinois, tout en ouvrant ce clob en utilisant crapaud je suis capable de voir le texte chinois.Le texte chinois n'apparaît pas dans csv

Mais lors du téléchargement de mon application le texte chinois est brouillé.

Ci-dessous est mon code pour télécharger au format csv.

public void read(final String outputFile, final String fileEncoding, long Id) throws Exception { 
     try { 
      template.query(QUERY, Id, new ResultSetExtractor<Void>() { 
       @Override 
       public Void extract(ResultSet resultSet) throws SQLException { 
        String encoding = fileEncoding == null ? Charset.defaultCharset().name() : fileEncoding; 
        try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), encoding))) { 
         if (resultSet.next()) { 
          Clob clob = resultSet.getClob(1); 
          try (BufferedReader reader = new BufferedReader(clob.getCharacterStream())) { 
           char[] buffer = new char[1]; 
           int length = 0; 
           while (true) { 
            length = reader.read(buffer, 0, 1); 
            if (length == -1) 
             break; 
            writer.write(buffer); 
           } 
          } 
          writer.flush(); 
         } 
         return null; 
        } catch (Exception e) { 
         e; 
        } 
       } 
      }); 
     } 
    } 

Voici le fileEncoding je passe comme GBK. Supposons que mon fichier dans clob contienne le texte chinois 记录 mais, il est affiché comme ¼Ç¼. Je veux si j'ouvre le fichier de csv dans le format d'Excel il devrait le texte chinois tel qu'il est. Et si le fichier contient l'en-tête avec un * comme * ABC, il doit être formaté.

J'ai essayé de changer le codage en UTF-8 mais, pas de chance.

Est-ce possible avec l'encodage GBK?

Répondre

0

Le problème semble être hapenning lorsque vous lisez ce clob.getCharacterStream() - qui retournera les caractères en utilisant le codage de plate-forme par défaut. Vous devez le lire en utilisant l'encodage approprié. Essayez ceci:

InputStream inputStream = clob.getAsciiStream(); 
Reader reader = new InputStreamReader(inputStream, encoding); 

Cela devrait résoudre vos problèmes.

+0

il ne fonctionne pas, il donne un texte différent avec l'encodage GBK. Est-il possible d'utiliser GBK? – Arat

+0

Lors de la lecture du CLOB, le codage doit correspondre au codage utilisé dans la base de données. Il semble que vous utilisiez le même encodage pour la lecture et l'écriture, mais vous en avez besoin pour lire (pour correspondre à ce qui est stocké) et pour écrire dans la sortie. –

+0

En fait, lors du stockage dans CLOB, nous récupérons des données à partir d'un fichier texte et les stockons dans CLOB, et nous utilisons le codage ** GBK ** lors du stockage sur db. Mais en lisant db si nous utilisons le même encodage GBK, le texte chinois ne s'affiche pas correctement. – Arat