2009-06-16 8 views
154

Ho un codice corrente e il problema è la creazione di un file di codice 1252, voglio forzarlo a creare un file UTF-8Come scrivere un file UTF-8 con Java?

Qualcuno può aiutarmi con questo codice, come dico che attualmente funziona .. . ma ho bisogno di forzare il salvataggio su utf .. posso passare un parametro o qualcosa ??

questo è ciò che ho, tutto l'aiuto davvero apprezzato

var out = new java.io.FileWriter(new java.io.File(path)), 
     text = new java.lang.String(src || ""); 
    out.write(text, 0, text.length()); 
    out.flush(); 
    out.close(); 
+2

Si prega di inviare il codice che passa il compilatore, se possibile. – JesperE

+0

sembra essere un rinoceronte (javascript) – dfa

risposta

167

Invece di usare FileWriter, creare un FileOutputStream. È quindi possibile avvolgere questo in un OutputStreamWriter, che consente di passare una codifica nel costruttore. Poi si può scrivere i dati su che:

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8) 
+106

... e maledire Sun non sta inserendo un costruttore in FileWriter che prende un set di caratteri. –

+2

Sembra una svista strana. E non l'hanno ancora riparato. – skaffman

+3

@Jon Skeet: Dato che FileWriter è un wrapper per FileOutputStream che presuppone la codifica e la dimensione del buffer predefinite, non sarebbe in grado di sconfiggere il punto? – Powerlord

181

Prova questa

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8")); 
try { 
    out.write(aString); 
} finally { 
    out.close(); 
} 
+1

Penso che ci sia un errore di battitura. 'Writer out = ...'deve essere corretto su ' BufferedWriter out = ... '. – asmaier

+18

Writer è la classe astratta, BufferedWriter sta implementando e write() + close() sono dichiarati. –

+3

Questo crea un UTF-8 effettivo senza BOM, non solo UTF-8. C'è un modo per forzarlo? – neverMind

8
var out = new java.io.PrintWriter(new java.io.File(path), "UTF-8"); 
text = new java.lang.String(src || ""); 
out.print(text); 
out.flush(); 
out.close(); 
18

Prova utilizzando FileUtils.write da Apache Commons.

Si dovrebbe essere in grado di fare qualcosa di simile:

File f = new File("output.txt"); 
FileUtils.writeStringToFile(f, document.outerHtml(), "UTF-8"); 

questo creerà il file se non esiste.

+3

Questo produce anche un file UTF-8 senza BOM ... Non so se è rilevante o meno. – neverMind

+3

@Smarty solo se si sta già utilizzando Apache Commons. Altrimenti sembra uno spreco terribile includere un altro barattolo solo perché non vuoi scrivere qualche altro personaggio. – Jason

+0

Non riesco a vedere un metodo 'write (..)' nella classe FileUtils. Ho controllato i commons IO 1.4 – RRM

21

Tutte le risposte fornite qui non funzionano poiché la scrittura UTF-8 di java è disturbata.

http://tripoverit.blogspot.com/2007/04/javas-utf-8-and-unicode-writing-is.html

+0

Per quanto ne so, il bug è questo (poiché l'autore di quell'articolo non si preoccupa di menzionarlo): http://bugs.sun.com/view_bug.do?bug_id=4508058 – Chris

+4

L'unico problema quando la scrittura è la BOM mancante. Nessun grosso problema. La lettura di un file con una distinta materiali invece richiede la rimozione manuale. –

+2

UTF-8 non ha bisogno di BOM, quindi tecnicamente il file scritto è ancora un file di testo con codifica UTF-8 valido. Il bug è con la lettura di un UTF-8 con BOM. – Dikei

3

possiamo scrivere il file codifica UTF-8 con Java utilizzando uso PrintWriter scrivere UTF-8 XML codificato

Oppure Fare clic here

PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "UTF-8"); 
5

Il Java 7 Files utility type è utile per lavoro con i file:

import java.nio.charset.StandardCharsets; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.io.IOException; 
import java.util.*; 

public class WriteReadUtf8 { 
    public static void main(String[] args) throws IOException { 
    List<String> lines = Arrays.asList("These", "are", "lines"); 

    Path textFile = Paths.get("foo.txt"); 
    Files.write(textFile, lines, StandardCharsets.UTF_8); 

    List<String> read = Files.readAllLines(textFile, StandardCharsets.UTF_8); 

    System.out.println(lines.equals(read)); 
    } 
} 

Il Java 8 version consente di omettere l'argomento Charset - i metodi vengono impostati su UTF-8.

13

Dal momento che Java 7 è possibile fare lo stesso con Files.newBufferedWriter un po 'più succintamente:

Path logFile = Paths.get("/tmp/example.txt"); 
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) { 
    writer.write("Hello World!"); 
    .. 
} 
+2

Questo dovrebbe essere al top! –

2

Di seguito il codice di esempio in grado di leggere file riga per riga e scrivere nuovo file in formato UTF-8. Inoltre, sto specificando esplicitamente la codifica Cp1252.

public static void main(String args[]) throws IOException { 

    BufferedReader br = new BufferedReader(new InputStreamReader(
      new FileInputStream("c:\\filenonUTF.txt"), 
      "Cp1252")); 
    String line; 

    Writer out = new BufferedWriter(
      new OutputStreamWriter(new FileOutputStream(
        "c:\\fileUTF.txt"), "UTF-8")); 

    try { 

     while ((line = br.readLine()) != null) { 

      out.write(line); 
      out.write("\n"); 

     } 

    } finally { 

     br.close(); 
     out.close(); 

    } 
}