2009-06-16 15 views
154

Tengo un código actual y el problema es crear un archivo de página de códigos 1252, quiero forzarlo a crear un archivo UTF-8¿Cómo escribir un archivo UTF-8 con Java?

¿Alguien puede ayudarme con este código, como digo que actualmente funciona ... .pero necesito forzar la salvación en utf ... ¿puedo pasar un parámetro o algo así?

esto es lo que tengo, cualquier ayuda muy 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, publique el código que pasa el compilador, si es posible. – JesperE

+0

parece ser Rhino (javascript) – dfa

Respuesta

167

En lugar de utilizar FileWriter, crear un FileOutputStream. Puede envolver esto en un OutputStreamWriter, que le permite pasar una codificación en el constructor. A continuación, puede escribir los datos en que:

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8) 
+106

... y maldecir a Sun sin poner en un constructor a FileWriter que toma un Charset. –

+2

Parece un descuido extraño. Y todavía no lo han arreglado. – skaffman

+3

@Jon Skeet: dado que FileWriter es un contenedor para FileOutputStream que asume la codificación predeterminada y el tamaño del búfer, ¿no vencería eso? – Powerlord

181

probar este

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

Creo que hay un error tipográfico. 'Writer out = ...'debe corregirse a ' BufferedWriter out = ... '. – asmaier

+18

Writer es la clase abstracta, BufferedWriter está implementando y write() + close() se declaran. –

+3

Esto crea un UTF-8 real sin BOM, no solo UTF-8. ¿Hay alguna manera de forzar eso? – neverMind

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

Trate de usar FileUtils.write de Apache Commons.

Usted debe ser capaz de hacer algo como:

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

Esto creará el archivo si no existe.

+3

Esto también produce un archivo UTF-8 sin lista de materiales ... No sé si es relevante o no. – neverMind

+3

@Smarty solo si ya está usando Apache Commons. De lo contrario, parece una pérdida terrible incluir otro contenedor simplemente porque no desea escribir unos pocos caracteres más. – Jason

+0

No pude ver el método 'write (..)' en la clase FileUtils. Revisé los recursos comunes IO 1.4 – RRM

21

Todas las respuestas dadas aquí no funcionarán ya que la escritura de UTF-8 de Java tiene errores.

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

+0

Por lo que puedo decir, el error es este (ya que el autor de ese artículo no se molesta en mencionarlo): http://bugs.sun.com/view_bug.do?bug_id=4508058 – Chris

+4

El único problema cuando escribir es la lista de materiales faltante. No es gran cosa. Por otro lado, leer un archivo con una lista de materiales requiere que se elimine manualmente. –

+2

UTF-8 no necesita BOM, por lo que técnicamente el archivo escrito sigue siendo un archivo de texto codificado UTF-8 válido. El error está en leer un UTF-8 con BOM. – Dikei

3

podemos escribir el archivo de codificación UTF-8 con Java utilizando uso PrintStream escribir UTF-8 XML codificados

O Haga clic en here

PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "UTF-8"); 
5

El Java 7 Files utility type es útil para trabajando con archivos:

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

El Java 8 version le permite omitir el argumento Charset - los métodos predeterminados para UTF-8.

13

Desde Java 7 se puede hacer lo mismo con Files.newBufferedWriter un poco más sucinta:

Path logFile = Paths.get("/tmp/example.txt"); 
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) { 
    writer.write("Hello World!"); 
    .. 
} 
+2

¡Esto debería estar en la parte superior! –

2

A continuación código de ejemplo puede leer archivo línea por línea y escribir nuevo archivo en formato UTF-8. Además, explícitamente estoy especificando la codificación 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(); 

    } 
}