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.