Comment écrire un fichier UTF-8 avec Java?

183

J'ai du code actuel et le problème est de créer un fichier de page de code 1252, je veux le forcer à créer un fichier UTF-8

Quelqu'un peut-il m'aider avec ce code, comme je dis qu'il fonctionne actuellement ... mais je dois forcer la sauvegarde sur utf .. puis-je passer un paramètre ou quelque chose?

c'est ce que j'ai, toute aide vraiment appréciée

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();
Mark Smith
la source
2
Veuillez publier le code qui passe le compilateur, si possible.
JesperE
il semble être rhinocéros (javascript)
dfa

Réponses:

210

Au lieu d'utiliser FileWriter, créez un fichier FileOutputStream. Vous pouvez ensuite envelopper ceci dans un OutputStreamWriter, ce qui vous permet de passer un encodage dans le constructeur. Ensuite, vous pouvez écrire vos données dans une instruction try-with-resources :

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}
skaffman
la source
118
... et malédiction à Sun de ne pas mettre un constructeur dans FileWriter qui prend un Charset.
Jon Skeet le
3
Cela semble être un oubli étrange. Et ils ne l'ont toujours pas résolu.
skaffman
4
@Jon Skeet: Étant donné que FileWriter est un wrapper pour FileOutputStream qui suppose l'encodage et la taille de la mémoire tampon par défaut, cela ne va-t-il pas vaincre le point?
Powerlord
Désolé, je voulais dire pour OutputStreamWriter, pas pour FileOutputStream.
Powerlord
199

Essaye ça

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}
Markus Lausberg
la source
1
Je pense qu'il y a une faute de frappe. Writer out = ...devrait être corrigé en BufferedWriter out = ... .
asmaier le
20
Writer est la classe abstraite, BufferedWriter l'implémente et write () + close () sont déclarés.
Markus Lausberg
3
Cela crée un UTF-8 réel sans BOM, pas seulement UTF-8. Y a-t-il un moyen de forcer cela?
neverMind
26

Essayez d'utiliser à FileUtils.writepartir d'Apache Commons.

Vous devriez pouvoir faire quelque chose comme:

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

Cela créera le fichier s'il n'existe pas.

UN M
la source
4
Cela produit également un fichier UTF-8 WIthout BOM ... Je ne sais pas si c'est pertinent ou non.
neverMind
3
@Smarty uniquement si vous utilisez déjà Apache Commons. Sinon, cela semble un gaspillage terrible d'inclure un autre pot simplement parce que vous ne voulez pas écrire quelques caractères de plus.
Jason
Je ne pouvais pas voir une méthode 'write (..)' dans la classe FileUtils. J'ai vérifié dans les communs IO 1.4
RRM
Si vous lisez les documents Java sur le lien indiqué dans la question, cela vous indique la version de l'API Commons IO où les API d'écriture ont été introduites. Il semble que les API d'écriture aient été introduites à partir de la v2.0.
A_M
Je voudrais juste mentionner que j'ai utilisé la méthode FileUtils.writeStringToFile (...) (avec commons-io-1.3.1.jar) au lieu de FileUtils.write (...).
Léa Massiot
21

Toutes les réponses données ici ne fonctionneront pas car l'écriture UTF-8 de java est boguée.

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

Emperorlou
la source
Pour autant que je sache, le bogue est celui-ci (puisque l'auteur de cet article ne prend pas la peine de le mentionner): bugs.sun.com/view_bug.do?bug_id=4508058
Chris
4
Le seul problème lors de l'écriture est la nomenclature manquante. Pas grand-chose. La lecture d'un fichier avec une nomenclature nécessite en revanche de le décaper manuellement.
Axel Fontaine
2
UTF-8 n'a pas besoin de nomenclature, donc techniquement, le fichier écrit est toujours un fichier texte encodé en UTF-8 valide. Le bogue concerne la lecture d'un UTF-8 avec BOM.
Kien Truong
@Chris le lien bugs.sun.com est rompu. En avez-vous un qui fonctionne?
Matthias
Fonctionne toujours pour moi; Je ne suis pas connecté ou quoi que ce soit. Essayez de rechercher le bogue 4508058 sur Google.
Chris
21

Depuis Java 7, vous pouvez faire la même chose avec Files.newBufferedWriterun peu plus succinctement:

Path logFile = Paths.get("/tmp/example.txt");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    writer.write("Hello World!");
    // ...
}
Nigel_V_Thomas
la source
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();
boxofrats
la source
6

Le type d'utilitaire Java 7 Files est utile pour travailler avec des fichiers:

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 version Java 8 vous permet d'omettre l' argument Charset - les méthodes par défaut sont UTF-8.

McDowell
la source
4

nous pouvons écrire le fichier encodé UTF-8 avec java en utilisant utiliser PrintWriter pour écrire du xml encodé UTF-8

Ou cliquez ici

PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "UTF-8");
Dharmesh Patel
la source
3

L'exemple de code ci-dessous peut lire le fichier ligne par ligne et écrire un nouveau fichier au format UTF-8. En outre, je spécifie explicitement le codage 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();

    }
}
Ammad
la source