[java] 기본 Java 문자 인코딩 설정

프로그래밍 방식으로 JVM (1.5.x)에서 사용하는 기본 문자 인코딩을 올바르게 설정하려면 어떻게합니까?

-Dfile.encoding=whatever이전 JVM 을 사용하는 방법이었던 것을 읽었습니다 . 나는 들어 가지 않을 이유로 사치가 없습니다.

나는 시도했다 :

System.setProperty("file.encoding", "UTF-8");

그리고 속성이 설정되었지만 getBytes아래 의 최종 호출로 UTF8을 사용 하지 않는 것 같습니다 .

System.setProperty("file.encoding", "UTF-8");

byte inbytes[] = new byte[1024];

FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
FileOutputStream fos = new FileOutputStream("response-2.txt");
String in = new String(inbytes, "UTF8");
fos.write(in.getBytes());



답변

불행하게도, file.encodingJVM이 시작될 때 특성을 지정해야합니다. 기본 방법은 입력 된 시간, 캐릭터로의 부호화 String.getBytes()및 기본 생성자 InputStreamReaderOutputStreamWriter영구적으로 캐시되었습니다.

Edward Grech가 지적한 것처럼 이와 같은 특별한 경우 환경 변수 를 사용하여이 속성을 지정할 JAVA_TOOL_OPTIONS 있지만 일반적으로 다음과 같이 수행됩니다.

java -Dfile.encoding=UTF-8  com.x.Main

Charset.defaultCharset()file.encoding속성 에 대한 변경 사항을 반영 하지만 기본 문자 인코딩을 결정해야하는 핵심 Java 라이브러리의 대부분의 코드는이 메커니즘을 사용하지 않습니다.

인코딩 또는 디코딩 할 때 file.encoding속성을 쿼리 하거나 Charset.defaultCharset()현재 기본 인코딩을 찾은 다음 적절한 메서드 또는 생성자 오버로드를 사용하여 지정할 수 있습니다.


답변

로부터 JVM ™ 도구 인터페이스 문서 …

예를 들어 내장 VM 또는 단순히 스크립트 내에서 시작된 VM과 같은 명령 줄에 항상 액세스하거나 수정할 수 없기 JAVA_TOOL_OPTIONS때문에 이러한 경우 에이전트를 시작할 수 있도록 변수가 제공됩니다.

(Windows) 환경 변수 JAVA_TOOL_OPTIONS를 로 설정하면 JVM이 시작될 때마다 -Dfile.encoding=UTF8(Java) System특성이 자동으로 설정됩니다. 다음 메시지가 게시되어 매개 변수가 선택되었음을 알 수 있습니다 System.err.

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8


답변

나는 확실히 작동하는 해키 방법이있다!!

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

이렇게하면 JVM을 속여 문자 세트가 설정되지 않았다고 생각하고 런타임에 다시 UTF-8로 설정합니다!


답변

플랫폼의 기본 문자 세트를 설정하는 것보다 더 나은 접근 방법이 있다고 생각합니다. 특히 플랫폼뿐만 아니라 응용 프로그램 배포에 영향을 미치는 것처럼 보이는 것이 훨씬 안전 String.getBytes("charsetName")합니다. 그렇게하면 응용 프로그램이 제어 할 수없는 것에 의존하지 않습니다.

필자는 개인적으로 String.getBytes()개발자가 기본 문자 집합 변경 가능성을 설명하지 않은 여러 사례에서 심각한 문제를 일으켰으므로 더 이상 사용되지 않아야한다고 생각합니다 .


답변

원래 질문에 대답 할 수는 없지만 JVM의 기본 인코딩에 의존하지 말고 조언을 드리고 싶습니다. 코드에서 원하는 인코딩 (예 : “UTF-8”)을 명시 적으로 지정하는 것이 가장 좋습니다. 그렇게하면 다른 시스템과 JVM 구성에서도 작동한다는 것을 알고 있습니다.


답변

이 시도 :

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))


답변

우리는 같은 문제를 겪고있었습니다. 우리는이 기사 (및 기타)에서 제안하지 않은 몇 가지 제안을 체계적으로 시도했습니다. 우리는 또한-Dfile.encoding=UTF8 아무것도 작동하지 않는 것 같습니다.

이 문제가있는 사람들을 위해 다음 기사는 로케일 설정이 어떻게 침입하는지 설명하는 데 도움이 unicode/UTF-8되었습니다Java/Tomcat

http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

~/.bashrc파일 에서 로케일을 올바르게 설정하면 도움이되었습니다.