Como escrever um arquivo UTF-8 com Java?

180

Eu tenho algum código atual e o problema é a criação de um arquivo de página de código 1252, quero forçá-lo a criar um arquivo UTF-8

Alguém pode me ajudar com este código, como eu digo que atualmente funciona ... mas eu preciso forçar a salvar em utf .. posso passar um parâmetro ou algo assim?

é isso que eu tenho, qualquer ajuda realmente apreciada

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
fonte
2
Por favor, poste o código que passa no compilador, se possível.
JesperE
parece ser rhino (javascript)
dfa

Respostas:

208

Em vez de usar FileWriter, crie um FileOutputStream. Em seguida, você pode agrupar isso em um OutputStreamWriter, o que permite passar uma codificação no construtor. Em seguida, você pode gravar seus dados em uma instrução try-with-resources :

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}
skaffman
fonte
118
... e xingue a Sun não colocando um construtor no FileWriter que usa um conjunto de caracteres.
Jon Skeet
3
Parece uma supervisão estranha. E eles ainda não o consertaram.
skaffman
4
@ Jon Skeet: Dado que o FileWriter é um invólucro para o FileOutputStream que assume a codificação padrão e o tamanho do buffer, isso não seria um problema?
Powerlord
Desculpe, eu quis dizer com OutputStreamWriter, não para FileOutputStream.
Powerlord
198

Tente isto

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}
Markus Lausberg
fonte
1
Eu acho que há um erro de digitação. Writer out = ...deve ser corrigido para BufferedWriter out = ... .
Asmaier 09/07/10
20
Writer é a classe Abstract, BufferedWriter está implementando e write () + close () são declarados.
Markus Lausberg
3
Isso cria um UTF-8 real sem BOM, não apenas UTF-8. Existe uma maneira de forçar isso?
Nevermind
25

Tente usar FileUtils.write Apache Commons.

Você deve ser capaz de fazer algo como:

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

Isso criará o arquivo se ele não existir.

SOU
fonte
4
Isso também produz um arquivo UTF-8 SEM BOM ... Não sei se é relevante ou não.
Nevermind
3
@ Smart apenas se você já estiver usando o Apache Commons. Caso contrário, parece um desperdício terrível incluir outro jarro apenas porque você não deseja escrever mais alguns caracteres.
Jason
Não consegui ver um método 'write (..)' na classe FileUtils. Eu verifiquei no commons IO 1.4
RRM
Se você ler os documentos Java no link mostrado na pergunta, ele informará a versão da API do Commons IO na qual as APIs de gravação foram introduzidas. Parece que as APIs de gravação foram introduzidas a partir da v2.0.
A_M
Gostaria apenas de mencionar que usei o método FileUtils.writeStringToFile (...) (com commons-io-1.3.1.jar) em vez de FileUtils.write (...).
Léa Massiot
21

Todas as respostas dadas aqui não funcionam, pois a escrita UTF-8 do java está com erros.

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

Emperorlou
fonte
Tanto quanto posso dizer, o bug é esse (uma vez que o autor desse artigo não se importa em mencioná-lo): bugs.sun.com/view_bug.do?bug_id=4508058
Chris
4
O único problema ao escrever é a lista técnica ausente. Nada demais. A leitura de um arquivo com uma lista técnica, por outro lado, exige a remoção manual.
Axel Fontaine
2
O UTF-8 não precisa da BOM, portanto, tecnicamente, o arquivo gravado ainda é um arquivo de texto codificado UTF-8 válido. O erro está na leitura de um UTF-8 com BOM.
achou do
@ Chris, o link bugs.sun.com está quebrado. Você tem um que funcione?
Matthias
Ainda funciona para mim; Não estou logado nem nada. Tente googling para bug 4508058.
Chris
21

Desde o Java 7, você pode fazer o mesmo com Files.newBufferedWriterum pouco mais sucintamente:

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

O tipo de utilitário Java 7 Files é útil para trabalhar com arquivos:

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

A versão do Java 8 permite omitir o argumento Charset - os métodos padrão para UTF-8.

McDowell
fonte
3

podemos escrever o arquivo codificado em UTF-8 com java usando use PrintWriter para escrever xml codificado em UTF-8

Ou clique aqui

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

Abaixo, o código de amostra pode ler o arquivo linha por linha e gravar um novo arquivo no formato UTF-8. Além disso, eu estou especificando explicitamente a codificação 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
fonte