Come scrivere un file UTF-8 con Java?


180

Ho un po 'di codice corrente e il problema è che sta creando un file codepage 1252, voglio forzarlo a creare un file UTF-8

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

questo è quello che ho, qualsiasi 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 inserire il codice che passa il compilatore, se possibile.
JesperE,

sembra essere rhino (javascript)
dfa

Risposte:


208

Invece di usare FileWriter, crea un FileOutputStream. È quindi possibile racchiuderlo in un OutputStreamWriter, che consente di passare una codifica nel costruttore. Quindi puoi scrivere i tuoi dati su quello all'interno di una dichiarazione di prova :

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}

118
... e maledire Sun non inserendo un costruttore in FileWriter che richiede un set di caratteri.
Jon Skeet,

3
Sembra una strana svista. E non l'hanno ancora risolto.
Skaffman,

4
@Jon Skeet: dato che FileWriter è un wrapper per FileOutputStream che assume la codifica e le dimensioni del buffer predefinite, ciò non vanificherebbe il punto?
Powerlord,

Spiacente, intendevo per OutputStreamWriter, non per FileOutputStream.
Powerlord,

198

Prova questo

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

1
Penso che ci sia un refuso. Writer out = ...dovrebbe essere corretto a BufferedWriter out = ... .
asmaier,

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

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

25

Prova a utilizzare FileUtils.writeda Apache Commons.

Dovresti essere in grado di fare qualcosa del tipo:

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

Questo creerà il file se non esiste.


4
Questo produce anche un file UTF-8 SENZA BOM ... Non so se sia rilevante o meno.
neverMind

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

Non riuscivo a vedere un metodo 'write (..)' nella classe FileUtils. Ho controllato i comuni IO 1.4
RRM

Se leggi i documenti Java sul link mostrato nella domanda, allora ti dice la versione dell'API di IO IO in cui sono state introdotte le API di scrittura. Sembra che le API di scrittura siano state introdotte dalla v2.0 in poi.
A_M

Vorrei solo ricordare che ho usato il metodo FileUtils.writeStringToFile (...) (con commons-io-1.3.1.jar) invece di FileUtils.write (...).
Léa Massiot,

21

Tutte le risposte fornite qui non funzioneranno poiché la scrittura UTF-8 di Java è stata corretta.

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


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

4
L'unico problema quando si scrive è la DBA mancante. Nessun grosso problema. La lettura di un file con una DBA richiede invece la rimozione manuale.
Axel Fontaine,

2
UTF-8 non ha bisogno della BOM, quindi tecnicamente il file scritto è ancora un file di testo codificato UTF-8 valido. Il bug sta nel leggere un UTF-8 con BOM.
Kien Truong,

@Chris il link bugs.sun.com è interrotto. Ne hai uno che funziona?
Matthias,

Funziona ancora per me; Non ho effettuato l'accesso o altro. Prova a cercare su Google il bug 4508058.
Chris,

21

Da Java 7 puoi fare lo stesso con Files.newBufferedWriterun po 'più succintamente:

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

9
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();

6

Il tipo di utilità File Java 7 è utile per lavorare 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));
  }
}

La versione Java 8 consente di omettere l' argomento Charset , i metodi predefiniti su UTF-8.


3

possiamo scrivere il file codificato UTF-8 con Java usando use PrintWriter per scrivere xml codificato UTF-8

Oppure clicca qui

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

3

Sotto il codice di esempio puoi leggere il file riga per riga e scrivere un 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();

    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.