그러나 다음 코드가 있지만 외국 문자를 처리하기 위해 UTF-8 파일로 작성하고 싶습니다. 이 작업을 수행하는 방법이 있습니까? 매개 변수가 필요합니까?
도움을 주시면 정말 감사하겠습니다. 감사.
try {
BufferedReader reader = new BufferedReader(new FileReader("C:/Users/Jess/My Documents/actresses.list"));
writer = new BufferedWriter(new FileWriter("C:/Users/Jess/My Documents/actressesFormatted.csv"));
while( (line = reader.readLine()) != null) {
//If the line starts with a tab then we just want to add a movie
//using the current actor's name.
if(line.length() == 0)
continue;
else if(line.charAt(0) == '\t') {
readMovieLine2(0, line, surname.toString(), forename.toString());
} //Else we've reached a new actor
else {
readActorName(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
답변
안전한 인코딩 생성자
Java가 인코딩 오류를 올바르게 알리도록하는 것은 까다 롭습니다. 당신은 사용해야 가장 자세한 그리고, 슬프게도, 적어도 사용되는 각각의 네 개의 다른 contructors의를 InputStreamReader
하고 OutputStreamWriter
인코딩 결함에 적절한 예외를받을 수 있습니다.
파일 I / O의 경우 항상 두 번째 인수 OutputStreamWriter
와 InputStreamReader
멋진 인코더 인수에 대해 항상 사용하십시오 .
Charset.forName("UTF-8").newEncoder()
다른 더 멋진 가능성도 있지만 예외 처리에는 세 가지 간단한 가능성 중 어느 것도 작동하지 않습니다. 다음을 수행합니다.
OutputStreamWriter char_output = new OutputStreamWriter(
new FileOutputStream("some_output.utf8"),
Charset.forName("UTF-8").newEncoder()
);
InputStreamReader char_input = new InputStreamReader(
new FileInputStream("some_input.utf8"),
Charset.forName("UTF-8").newDecoder()
);
달리기에 관해서
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
문제는 문자 스트림에 대해 전체 인코더 인수 형식을 사용하지 않으므로 인코딩 문제를 다시 놓칠 수 있다는 것입니다.
더 긴 예
다음은 파일 대신 프로세스를 관리하는 더 긴 예제입니다. 여기서는 두 개의 서로 다른 입력 바이트 스트림과 하나의 출력 바이트 스트림을 모두 전체 예외 처리 를 통해 UTF-8 문자 스트림 으로 승격합니다 .
// this runs a perl script with UTF-8 STD{IN,OUT,ERR} streams
Process
slave_process = Runtime.getRuntime().exec("perl -CS script args");
// fetch his stdin byte stream...
OutputStream
__bytes_into_his_stdin = slave_process.getOutputStream();
// and make a character stream with exceptions on encoding errors
OutputStreamWriter
chars_into_his_stdin = new OutputStreamWriter(
__bytes_into_his_stdin,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newEncoder()
);
// fetch his stdout byte stream...
InputStream
__bytes_from_his_stdout = slave_process.getInputStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stdout = new InputStreamReader(
__bytes_from_his_stdout,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
// fetch his stderr byte stream...
InputStream
__bytes_from_his_stderr = slave_process.getErrorStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stderr = new InputStreamReader(
__bytes_from_his_stderr,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
지금 당신은 오류를 인코딩하는 모든 인상 예외가 각각라는 것을 세 가지 문자 스트림을 chars_into_his_stdin
, chars_from_his_stdout
하고 chars_from_his_stderr
.
이것은 문제에 필요한 것보다 약간 더 복잡합니다.이 답변의 전반부에서 솔루션을 제공했습니다. 요점은 이것이 인코딩 오류를 감지하는 유일한 방법이라는 것입니다.
PrintStream
식사 예외 에 대해 시작하지 마십시오 .
답변
도랑 FileWriter
그리고 FileReader
그들은 당신이 인코딩을 지정하는 것을 허용하지 않습니다 정확히 때문에 쓸모. 대신
new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)
과
new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
답변
OutputStreamWriter
.NET Framework에 대한 작성기 매개 변수로 클래스 를 사용해야 합니다 BufferedWriter
. 인코딩을 허용합니다. 리뷰javadocs그것에 대한 를 하십시오.
다음과 같이 :
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("jedis.txt"), "UTF-8"
));
또는 시스템 속성 file.encoding
을 사용하여 현재 시스템 인코딩 을 UTF-8로 설정할 수 있습니다 .
java -Dfile.encoding=UTF-8 com.jediacademy.Runner arg1 arg2 ...
System.setProperty(...)
이 특정 파일에만 필요한 경우 런타임에 시스템 속성으로 설정할 수도 있지만 이와 같은 경우에는OutputStreamWriter
.
시스템 속성을 설정하면 FileWriter
UTF-8을 파일의 기본 인코딩으로 사용할 수 있으며 예상 할 수 있습니다 . 이 경우 읽고 쓰는 모든 파일에 적용됩니다.
편집하다
-
API 19부터 문자열 “UTF-8″을 다음으로 바꿀 수 있습니다.
StandardCharsets.UTF_8
-
tchrist의 아래 주석에서 제안했듯이 파일에서 인코딩 오류를 감지하려면
OutputStreamWriter
접근 방식을 사용하고 문자 집합 인코더를 수신하는 생성자를 사용해야합니다.다소 좋아
CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); encoder.onMalformedInput(CodingErrorAction.REPORT); encoder.onUnmappableCharacter(CodingErrorAction.REPORT); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("jedis.txt"),encoder));
작업 중에서 선택할 수 있습니다.
IGNORE | REPLACE | REPORT
답변
Java 11부터 다음을 수행 할 수 있습니다.
FileWriter fw = new FileWriter("filename.txt", Charset.forName("utf-8"));
답변
Java 7부터는 BufferedWriter 및 BufferedReaders의 문자 인코딩을 쉽게 처리 할 수 있습니다. Writer의 다양한 인스턴스를 만드는 대신 Files 클래스를 사용하여 BufferedWriter를 직접 만들 수 있습니다. 다음을 호출하여 문자 인코딩을 고려하는 BufferedWriter를 간단히 만들 수 있습니다.
Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8);
JavaDoc에서 자세한 내용을 찾을 수 있습니다.
답변
중국어 텍스트로 Charset UTF-16을 사용하려고 시도했지만 운이 좋게 작동합니다.
이것이 도움이되기를 바랍니다!
PrintWriter out = new PrintWriter( file, "UTF-16" );
답변
이제 2019 년이되었습니다. Java 11에서는 Charset이 포함 된 생성자가 있습니다.
FileWriter(String fileName, Charset charset)
안타깝게도 여전히 바이트 버퍼 크기를 수정할 수 없으며 8192로 설정되어 있습니다. ( https://www.baeldung.com/java-filewriter )