2013-03-12 1 views
3

파일 인코딩을 ANSI (windows-1252)에서 UTF8로 변경해야한다는 요구 사항이 있습니다. 나는 자바를 통해 그것을하기 위해 아래 프로그램을 썼다. 이 프로그램은 문자를 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

게시 된 코드가 제대로 UTF-8로 창-1252에서 변환합니다.

"ANSI as UTF-8"에 명백한 의미가 없으므로 Notepad ++ 메시지가 혼란 스럽습니다. 메모장 ++에서 open defect 인 것으로 보입니다. 아마 UTF-8 파일이 바이트 순서 마크 (BOM)로 시작하는 기대, 메모장 ++가 UTF-8 BOM없이 (인코딩 메뉴를 참조하십시오.)

마이크로 소프트 액세스, Windows 프로그램 인 의미 믿습니다.

당신은 파일의 시작 부분에 코드 포인트 U + FEFF를 작성하여 문서에 BOM을 삽입 할 수

:

윈도우 7 (64 비트)에
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, 나는 당신이 여기서 준 정확한 솔루션을 찾고있었습니다. David, Andrew, Joop, 시간을 줘서 고마워. – Ashish

+0

위의 해결 방법에 대한 또 다른 문제가 있습니다. 여러 파일이있는 폴더를 변환 할 때 작은 크기의 파일이 완전히 비어있는 동안 일부 파일이 잘 렸습니다. 버퍼 크기를 줄임으로써 파일 변환을 시도했지만 성공하지 못했습니다. 어느 누구도 이것에 어떤 생각을 가지고 있습니까 ??? – Ashish

+0

출력 스트림과 같은 사운드가 제대로 닫히지 않습니다. 위의 정확한 코드를 사용하고 있습니까? – McDowell

1

, 자바 (8)를 실행, 나는에 있었다 모든 파일을 닫습니다. 그렇지 않으면 파일이 4KB의 배수로 잘립니다. 마지막 파일 세트를 닫는 것만으로는 충분하지 않습니다. 원하는 결과를 얻으려면 모든 파일을 닫아야했습니다. 오류 메시지를 추가하는 수정 된 버전 게시 :

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

}