2013-03-12 3 views
3

У меня есть требование изменить кодировку файла с ANSI (windows-1252) на UTF8. Я написал ниже программу, чтобы сделать это через java. Эта программа преобразует символы в UTF8, но когда я открыл файл в notepade ++, тип кодировки был отображен как ANSI как UTF8. Это дает мне ошибку, когда я импортирую этот файл в db доступа. Желателен только файл с кодировкой UTF8. Также необходимо преобразовать файл, не открывая его в любом редакторе.Преобразование кодировки файла Java

общественного класса 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(); 
    } 
} 

}

Все указатели будут полезны.

Спасибо, Ashish

+0

Вы пытались использовать [iconv] (http://www.fileformat.info/tip/linux/iconv.htm)? Также есть ссылка на двоичный файл Windows. – 9000

+0

Что означает «тип кодирования, отображаемый как ANSI как UTF8»? Что заставляет вас думать, что эта программа не конвертировала файл из Windows-1252 в UTF-8? –

+0

Какую версию Java вы используете? – anstarovoyt

ответ

4

Опубликованный код правильно перекодирует из окон-1252 в UTF-8.

Сообщение Notepad ++ запутанно, потому что «ANSI as UTF-8» не имеет очевидного значения; он выглядит как open defect в Notepad ++. Я считаю, что Notepad ++ означает UTF-8 без BOM (см меню кодирования.)

Microsoft Access, являясь программой Windows, вероятно, ожидает UTF-8 файлов начать с порядка байтов знаком (BOM).

Вы можете вводить спецификацию в документ, написав точку кода U + FEFF в начале файла:

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

Большое спасибо McDowell, я искал точное решение, которое вы дали здесь. Дэвид, Эндрю, Джоп, спасибо, что отдали свое время. – Ashish

+0

Я наблюдаю еще одну проблему с вышеупомянутым решением. Когда я конвертирую папку со многими файлами, некоторые файлы усекаются, а файл с небольшим размером был полностью пустым. Я попытался преобразовать файлы, уменьшив размер буфера, но не удалось. У кого-нибудь есть какая-нибудь идея по этому поводу? – Ashish

+0

Похоже, что выходной поток не закрывается должным образом. Вы используете точный код выше? – McDowell

1

В Windows 7 (64-разрядная версия), запуск Java 8, я должен был закрыть каждый файл. В противном случае файлы будут усекаться до кратного 4 кБ. Недостаточно закрыть последний набор файлов, мне пришлось закрыть каждый файл, чтобы получить желаемый результат. Публикация моей адаптированной версии, которая добавляет сообщения об ошибках:

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

} 
Смежные вопросы