분명한 대답은 사용하는 Charset.defaultCharset()것이지만 최근에 이것이 정답이 아닐 수 있음을 발견했습니다. 결과가 java.io 클래스에서 사용하는 실제 기본 문자 집합과 여러 번 다르다고 들었습니다. Java가 2 세트의 기본 문자 세트를 유지하는 것처럼 보입니다. 누구든지이 문제에 대한 통찰력이 있습니까?
하나의 실패 사례를 재현 할 수있었습니다. 일종의 사용자 오류이지만 다른 모든 문제의 근본 원인을 여전히 노출 할 수 있습니다. 다음은 코드입니다.
public class CharSetTest {
public static void main(String[] args) {
System.out.println("Default Charset=" + Charset.defaultCharset());
System.setProperty("file.encoding", "Latin-1");
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("Default Charset in Use=" + getDefaultCharSet());
}
private static String getDefaultCharSet() {
OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
String enc = writer.getEncoding();
return enc;
}
}
레거시 프로토콜에서 일부 혼합 인코딩 (ANSI / Latin-1 / UTF-8)을 처리하려면 서버에 Latin-1의 기본 문자 집합이 필요합니다. 따라서 모든 서버는이 JVM 매개 변수로 실행됩니다.
-Dfile.encoding=ISO-8859-1
다음은 Java 5의 결과입니다.
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
누군가 코드에서 file.encoding을 설정하여 인코딩 런타임을 변경하려고합니다. 우리 모두는 그것이 작동하지 않는다는 것을 압니다. 그러나 이것은 분명히 defaultCharset ()을 던지지 만 OutputStreamWriter가 사용하는 실제 기본 문자 집합에는 영향을 미치지 않습니다.
버그 또는 기능입니까?
편집 : 수락 된 답변은 문제의 근본 원인을 보여줍니다. 기본적으로 I / O 클래스에서 사용하는 기본 인코딩이 아닌 Java 5의 defaultCharset ()을 신뢰할 수 없습니다. Java 6이이 문제를 해결 한 것 같습니다.