programing

Java FileReader 인코딩 문제

yoursource 2023. 2. 4. 09:40
반응형

Java FileReader 인코딩 문제

저는 java.io을 이용하려고 했습니다.FileReader에서 텍스트 파일을 읽고 문자열로 변환했지만 결과가 잘못 인코딩되어 전혀 읽을 수 없었습니다.

내 환경은 다음과 같습니다.

  • Windows 2003, OS 인코딩: CP1252

  • Java 5.0

파일은 UTF-8 인코딩 또는 CP1252 인코딩이며, 일부 파일(UTF-8 인코딩 파일)에는 중국어(비라틴어)가 포함되어 있을 수 있습니다.

다음 코드를 사용하여 작업을 수행합니다.

   private static String readFileAsString(String filePath)
    throws java.io.IOException{
        StringBuffer fileData = new StringBuffer(1000);
        FileReader reader = new FileReader(filePath);
        //System.out.println(reader.getEncoding());
        BufferedReader reader = new BufferedReader(reader);
        char[] buf = new char[1024];
        int numRead=0;
        while((numRead=reader.read(buf)) != -1){
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
        reader.close();
        return fileData.toString();
    }

위의 코드는 동작하지 않습니다.텍스트가 UTF-8로 인코딩되어 있어도 FileReader의 인코딩은 CP1252로 되어 있습니다.그러나 java.io의 JavaDoc.FileReader는 다음과 같이 말합니다.

이 클래스의 컨스트럭터는 기본 문자 인코딩과 기본 바이트 버퍼 크기가 적절하다고 가정합니다.

FileReader를 사용하는 경우 문자 인코딩을 직접 설정할 필요가 없다는 의미입니까?하지만 현재 잘못 인코딩된 데이터를 받고 있는데, 제 시투타션을 처리하는 올바른 방법은 무엇일까요?감사해요.

예, 읽을 파일의 인코딩을 지정해야 합니다.

예, 읽을 파일의 인코딩을 알아야 합니다.

아니요, 특정 "일반 텍스트" 파일의 인코딩을 추측할 수 있는 일반적인 방법은 없습니다.

one-arguments 컨스트럭터는 항상 플랫폼의 디폴트 부호화를 사용합니다.일반적으로 잘못된 생각입니다.

Java 11 이후FileReader는 부호화를 받아들이는 컨스트럭터도 취득했습니다.

이전 버전의 Java에서는, <encoding>).

FileReader는 Java의 플랫폼 기본 인코딩을 사용합니다. 이 인코딩은 Java가 실행되고 있는 컴퓨터의 시스템 설정에 따라 달라지며 일반적으로 해당 로케일에서 사용자에게 가장 많이 사용되는 인코딩입니다.

이 "최상의 추측"이 올바르지 않은 경우 인코딩을 명시적으로 지정해야 합니다.불행하게도,FileReader는 이를 허용하지 않습니다(API의 주요 감시).그 대신에, 당신은 그것을 사용해야 한다.new InputStreamReader(new FileInputStream(filePath), encoding)파일에 관한 메타데이터로부터 부호화를 취득하는 것이 이상적입니다.

Java 7+ 문서의 경우 다음을 사용할 수 있습니다.

BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);

여기 Charset 문서가 있습니다.

예를 들어 파일이 CP1252에 있는 경우 이 방법을 사용합니다.

Charset.forName("windows-1252");

다음은 IO 및 NIO 문서용 Java 인코딩의 다른 표준 이름입니다.

파일에 있는 인코딩을 정확하게 모르면 Google의 이 툴과 같은 서드파티 libs를 사용하면 매우 깔끔하게 작동합니다.

Java 11에서는 다음을 사용할 수 있습니다.

public FileReader(String fileName, Charset charset) throws IOException;

FileInputStreamReader는 인코딩 문자 집합을 지정할 수 없으므로 FileReader를 직접 사용하는 것보다 FileInputStream이 좋습니다.

다음은 파일에서 행을 읽을 수 있도록 BufferedReader, FileInputStream 및 InputStreamReader를 함께 사용하는 예입니다.

List<String> words = new ArrayList<>();
List<String> meanings = new ArrayList<>();
public void readAll( ) throws IOException{
    String fileName = "College_Grade4.txt";
    String charset = "UTF-8";
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(
            new FileInputStream(fileName), charset)); 

    String line; 
    while ((line = reader.readLine()) != null) { 
        line = line.trim();
        if( line.length() == 0 ) continue;
        int idx = line.indexOf("\t");
        words.add( line.substring(0, idx ));
        meanings.add( line.substring(idx+1));
    } 
    reader.close();
}

다른 라틴어(예: 키릴어)의 경우 다음과 같은 것을 사용할 수 있습니다.

FileReader fr = new FileReader("src/text.txt", StandardCharsets.UTF_8);

당신의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★..txtUTF-8, 디폴트로는 ).ANSI의 포맷입니다). 건!!

언급URL : https://stackoverflow.com/questions/696626/java-filereader-encoding-issue

반응형