2010-06-10 7 views
10

J'ai un fichier qui a des caractères non-utf8 (comme "ISO-8859-1"), et donc je veux convertir ce fichier (ou lire) en encodage UTF8, comment je peux le faire?java: comment convertir un fichier en utf8

Le code c'est comme ça:

File file = new File("some_file_with_non_utf8_characters.txt"); 

/* some code to convert the file to an utf8 file */ 

... 

modifier: Mettez un exemple de codage

+0

Non-UTF8? Voulez-vous réduire cela un peu? C'est facile une fois que vous connaissez le codage d'entrée, et essentiellement impossible si vous ne le faites pas. –

+0

quelques considérations, les fichiers sont grands (comme 1GB) donc je ne peux pas les mettre dans un objet String ... –

+0

quel est l'encodage de votre fichier? Si vous êtes sur Linux ou OS X (et un autre Un * x), vous pouvez simplement taper: * file un_fichier * et il vous indiquera l'encodage. Btw, si vous êtes sur Un * x (au moins à la fois Linux et OS X), vous devriez avoir la ligne de commande * iconv *. * "man iconv" * dit: * "Convertir l'encodage de fichiers donnés d'un codage à un autre" *, ce qui fera sans doute un meilleur travail sur un fichier de 1 Go qu'un utilitaire Java auto-écrit. Notez que l'encodage UTF-8 peut représenter chaque code Unicode, ce qui signifie que le fichier * "a des caractères non-utf8" * semble douteux ... – NoozNooz42

Répondre

8
String charset = "ISO-8859-1"; // or what corresponds 
    BufferedReader in = new BufferedReader( 
     new InputStreamReader (new FileInputStream(file), charset)); 
    String line; 
    while((line = in.readLine()) != null) { 
    .... 
    } 

Là, vous avez le texte décodé. Vous pouvez l'écrire, par les méthodes Writer/OutputStream, avec l'encodage que vous préférez (par exemple UTF-8).

+0

Il n'est pas nécessaire de lire ligne par ligne – OscarRyz

+2

bien sûr que non, c'est juste une façon possible. – leonbloy

+0

le problème potentiel avec la lecture ligne par ligne est que vous pouvez modifier les fins de ligne/séparations. Par exemple, si la dernière ligne n'a pas de fin de ligne, vous en ajouterez une. –

1

Vous voulez seulement lire en UTF-8? Ce que j'ai fait récemment avec un problème similaire est de démarrer la JVM avec -Dfile.encoding = UTF-8, et de lire/imprimer normalement. Je ne sais pas si cela s'applique à votre cas.

Avec cette option:

System.out.println("á é í ó ú") 

imprime correctement les caractères. Sinon, il imprime un? symbole

+2

http : //bugs.sun.com/view_bug.do? bug_id = 4163515 – McDowell

+0

@McD: J'allais poster le même commentaire. C'est une mauvaise interprétation de l'utilisation de '-Dfile.encoding'. – BalusC

+0

Je vois, c'est vraiment un gâchis. – Ismael

4

Vous devez connaître l'encodage du fichier d'entrée. Par exemple, si le fichier est en latin-1, vous feriez quelque chose comme ça,

 FileInputStream fis = new FileInputStream("test.in"); 
     InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1"); 
     Reader in = new BufferedReader(isr); 
     FileOutputStream fos = new FileOutputStream("test.out"); 
     OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); 
     Writer out = new BufferedWriter(osw); 

     int ch; 
     while ((ch = in.read()) > -1) { 
      out.write(ch); 
     } 

     out.close(); 
     in.close(); 
+2

Résumé: ** read ** dans l'encodage du fichier, puis ** write ** dans le nouvel encodage. – BalusC

14

Le code suivant convertit un fichier de srcEncoding à tgtEncoding:

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    BufferedReader br = null; 
    BufferedWriter bw = null; 
    try{ 
     br = new BufferedReader(new InputStreamReader(new FileInputStream(source),srcEncoding)); 
     bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding)); 
     char[] buffer = new char[16384]; 
     int read; 
     while ((read = br.read(buffer)) != -1) 
      bw.write(buffer, 0, read); 
    } finally { 
     try { 
      if (br != null) 
       br.close(); 
     } finally { 
      if (bw != null) 
       bw.close(); 
     } 
    } 
} 

--EDIT--

Utilisation de Try-avec-ressources (Java 7):

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    try (
     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), srcEncoding)); 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding));) { 
      char[] buffer = new char[16384]; 
      int read; 
      while ((read = br.read(buffer)) != -1) 
       bw.write(buffer, 0, read); 
    } 
} 
+2

Ignorer mon commentaire, vous avez raison.Btw, n'ont pas vu ce style de fermeture en avant finalement. Intelligent. – BalusC

Questions connexes