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);
당신의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★..txt
이 UTF-8
, 디폴트로는 ).ANSI
의 포맷입니다). 건!!
언급URL : https://stackoverflow.com/questions/696626/java-filereader-encoding-issue
'programing' 카테고리의 다른 글
brew install mysql on macOS (0) | 2023.02.04 |
---|---|
Larabel 5 show ErrorException file_put_contents가 스트림을 열지 못했습니다.해당 파일 또는 디렉터리가 없습니다. (0) | 2023.02.04 |
mariadb 서버:mysql.server stop'을 사용하여 서버를 중지할 수 없습니다. (0) | 2023.02.04 |
Python의 stdlib를 사용하여 로컬 IP 주소 찾기 (0) | 2023.02.04 |
봄의 @Valid 주석은 무엇을 의미합니까? (0) | 2023.02.04 |