Tengo un requisito para cambiar la codificación de un archivo de ANSI(windows-1252) a UTF8. Escribí a continuación el programa para hacerlo a través de java. Este programa convierte los caracteres en utf-8, pero cuando abrí el archivo en notepade++ el tipo de codificación que se muestra como ANSI como UTF8. Este me da error al importar este archivo en access db. Un archivo con la codificación UTF8 sólo es deseado. También el requisito es convertir el archivo sin abrirlo en cualquier editor.

clase pública ConvertFromAnsiToUtf8 {

private static final char BYTE_ORDER_MARK = '\uFEFF';
private static final String ANSI_CODE = "windows-1252";
private static final String UTF_CODE = "UTF8";
private static final Charset ANSI_CHARSET = Charset.forName(ANSI_CODE);
public static void main(String[] args) {
List<File> fileList;
File inputFolder = new File(args[0]);
if (!inputFolder.isDirectory()) {
return;
}
File parentDir = new File(inputFolder.getParent() + "\\"
+ inputFolder.getName() + "_converted");
if (parentDir.exists()) {
return;
}
if (parentDir.mkdir()) {
} else {
return;
}
fileList = new ArrayList<File>();
for (final File fileEntry : inputFolder.listFiles()) {
fileList.add(fileEntry);
}
InputStream in;
Reader reader = null;
Writer writer = null;
try {
for (File file : fileList) {
in = new FileInputStream(file.getAbsoluteFile());
reader = new InputStreamReader(in, ANSI_CHARSET);
OutputStream out = new FileOutputStream(
parentDir.getAbsoluteFile() + "\\"
+ file.getName());
writer = new OutputStreamWriter(out, UTF_CODE);
writer.write(BYTE_ORDER_MARK);
char[] buffer = new char[10];
int read;
while ((read = reader.read(buffer)) != -1) {
System.out.println(read);
writer.write(buffer, 0, read);
}
}
reader.close();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

Los punteros será útil.

Gracias,
Ashish

  • ¿Has probado con iconv? Hay un enlace a un binario para Windows, también.
  • ¿Qué significa «el tipo de codificación que se muestra como ANSI como UTF8» significa? ¿Qué te hace pensar que este programa no convertir el archivo de Windows-1252 a UTF-8?
  • Qué Versión de Java que Está Utilizando?
  • He usado Java 6. ANSI, UTF-8 significa que como dije si se abre el archivo con el editor que muestra la codificación, se mostrará como «ANSI, UTF-8». En mi caso he utilizado el notepad++, que se muestra en la parte inferior derecha.
  • La misma puede realizarse por dos llamadas a java native2ascii: native2ascii -encoding windows-1252 in.txt tmp.txt y, a continuación, native2ascii -reverse -encoding UTF-8 tmp.txt out.txt
InformationsquelleAutor Ashish | 2013-03-12

2 Comentarios

  1. 5

    Coloca el código correctamente transcodifica de windows-1252 a UTF-8.

    El Notepad++ mensaje es confuso, porque «ANSI, UTF-8» no tiene un significado evidente; parece ser un defecto abierto en el Bloc de notas++. Creo que el Bloc de notas++ significa UTF-8 sin BOM (ver el menú codificación.)

    De Microsoft Access, siendo un programa de Windows, probablemente espera archivos UTF-8 para iniciar con una orden de bytes de marca (Lista de materiales).

    Puede crear una lista de materiales en el documento por escrito, el punto de código U+FEFF en el inicio del archivo:

    import java.io.*;
    import java.nio.charset.*;
    public class Ansi1252ToUtf8 {
    private static final char BYTE_ORDER_MARK = '\uFEFF';
    public static void main(String[] args) throws IOException {
    Charset windows1252 = Charset.forName("windows-1252");
    try (InputStream in = new FileInputStream(args[0]);
    Reader reader = new InputStreamReader(in, windows1252);
    OutputStream out = new FileOutputStream(args[1]);
    Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) {
    writer.write(BYTE_ORDER_MARK);
    char[] buffer = new char[1024];
    int read;
    while ((read = reader.read(buffer)) != -1) {
    writer.write(buffer, 0, read);
    }
    }
    }
    }
    • Muchas gracias McDowell, yo estaba buscando la solución exacta que dio aquí. David, Andrés, Joop gracias por dar de su tiempo.
    • Estoy viendo otro problema con la solución anterior. Cuando me estoy convirtiendo en una carpeta con muchos archivos, algunos de los archivos están siendo truncado, mientras que un archivo con un tamaño pequeño estaba completamente en blanco. He tratado de convertir los archivos al reducir el tamaño del búfer, pero no tuvo éxito. Alguno tiene alguna idea sobre esto???
    • Suena como el flujo de salida no está cerrada correctamente. Está usted usando el código exacto de arriba?
    • Código actualizado en cuestión por sí mismo. Que es el código exacto que estoy utilizando. El cierre de los arroyos así. Por favor, eche un vistazo.
  2. 1

    En Windows 7 (64-Bit), la ejecución de Java 8, tuve que cerrar todos los archivos. De lo contrario, los archivos se trunca a múltiplos de 4 kB. No es suficiente para cerrar el último conjunto de archivos, tuve que cerrar todos los archivos para obtener el resultado deseado. Publicar mi versión adaptada que añade mensajes de error:

    import java.io.*;
    import java.nio.charset.*;
    import java.util.ArrayList;
    public class ConvertFromAnsiToUtf8 {
    private static final char BYTE_ORDER_MARK = '\uFEFF';
    private static final String ANSI_CODE = "windows-1252";
    private static final String UTF_CODE = "UTF8";
    private static final Charset ANSI_CHARSET = Charset.forName(ANSI_CODE);
    private static final String PATH_SEP = "\\";
    private static final boolean WRITE_BOM = false;
    public static void main(String[] args) 
    {
    if (args.length != 2) {
    System.out.println("Please name a source and a target directory");
    return;
    }
    File inputFolder = new File(args[0]);
    if (!inputFolder.isDirectory()) {
    System.out.println("Input folder " + inputFolder + " does not exist");
    return;
    }
    File outputFolder = new File(args[1]);
    if (outputFolder.exists()) {
    System.out.println("Folder " + outputFolder + " exists - aborting");
    return;
    }
    if (outputFolder.mkdir()) {
    System.out.println("Placing converted files in " + outputFolder);
    } else {
    System.out.println("Output folder " + outputFolder + " exists - aborting");
    return;
    }
    ArrayList<File> fileList = new ArrayList<File>();
    for (final File fileEntry : inputFolder.listFiles()) {
    fileList.add(fileEntry);
    }
    InputStream in;
    Reader reader = null;
    Writer writer = null;
    int converted = 0;
    try {
    for (File file : fileList) {
    try {
    in = new FileInputStream(file.getAbsoluteFile());
    reader = new InputStreamReader(in, ANSI_CHARSET);
    OutputStream out = new FileOutputStream(outputFolder.getAbsoluteFile() + PATH_SEP + file.getName());
    writer = new OutputStreamWriter(out, UTF_CODE);
    if (WRITE_BOM)
    writer.write(BYTE_ORDER_MARK);
    char[] buffer = new char[1024];
    int read;
    while ((read = reader.read(buffer)) != -1) {
    writer.write(buffer, 0, read);
    }
    ++converted;
    } finally {
    reader.close();
    writer.close();
    }
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    System.out.println(converted + " files converted");
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here