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

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
}

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

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.


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


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

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

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.


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

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

    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.