188 votes

Comment écrire un fichier UTF-8 avec Java ?

J'ai du code en cours et le problème est qu'il crée un fichier de codepage 1252, je veux le forcer à créer un fichier UTF-8.

Quelqu'un peut-il m'aider avec ce code, comme je l'ai dit il fonctionne actuellement ... mais j'ai besoin de forcer la sauvegarde sur utf ... puis-je passer un paramètre ou quelque chose ?

Voici ce que j'ai, toute aide est la bienvenue.

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 votes

Veuillez poster du code qui passe le compilateur, si possible.

0 votes

Il semble que ce soit rhino (javascript)

214voto

skaffman Points 197885

Au lieu d'utiliser FileWriter créer un FileOutputStream . Vous pouvez ensuite l'envelopper dans un OutputStreamWriter qui vous permet de passer un encodage dans le constructeur. Ensuite, vous pouvez écrire vos données dans ce code à l'intérieur d'une balise Déclaration "try-with-resources :

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

122 votes

... et maudire Sun de ne pas avoir mis un constructeur à FileWriter qui prend un Charset.

3 votes

C'est une drôle d'omission. Et ils ne l'ont toujours pas réparé.

4 votes

@Jon Skeet : Étant donné que FileWriter est une enveloppe pour FileOutputStream qui suppose l'encodage et la taille de la mémoire tampon par défaut, cela n'irait-il pas à l'encontre du but recherché ?

204voto

Markus Lausberg Points 6944

Essayez ceci

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

1 votes

Je pense qu'il y a une faute de frappe. Writer out = ... doit être corrigé en BufferedWriter out = ... .

20 votes

Writer est la classe abstraite, BufferedWriter est implémenté et write() + close() sont déclarés.

3 votes

Cela crée un UTF-8 réel sans BOM, et pas seulement un UTF-8. Existe-t-il un moyen de forcer cela ?

28voto

A_M Points 2897

Essayez d'utiliser FileUtils.write de Apache Commons.

Vous devriez être capable de faire quelque chose comme :

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

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

4 votes

Cela produit également un fichier UTF-8 WIthout BOM ... Je ne sais pas si c'est pertinent ou non.

3 votes

@Smarty uniquement si vous utilisez déjà Apache Commons. Dans le cas contraire, cela semble un terrible gaspillage d'inclure un autre jar juste parce que vous ne voulez pas écrire quelques caractères de plus.

0 votes

Je n'ai pas trouvé de méthode 'write(..)' dans la classe FileUtils. J'ai vérifié dans la commons IO 1.4

21voto

Emperorlou Points 319

Toutes les réponses données ici ne fonctionneront pas car l'écriture UTF-8 de Java est défectueuse.

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

0 votes

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

4 votes

Le seul problème lors de l'écriture est l'absence de nomenclature. Ce n'est pas un problème. En revanche, la lecture d'un fichier contenant une nomenclature nécessite de la supprimer manuellement.

2 votes

UTF-8 n'a pas besoin de BOM, donc techniquement le fichier écrit est toujours un fichier texte encodé UTF-8 valide. Le bogue se situe au niveau de la lecture d'un UTF-8 avec BOM.

9voto

boxofrats Points 692
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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X