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

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
}

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

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.


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


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!");
    // ...
}

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

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.


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");

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

    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.