프로그래밍 방식으로 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.encoding
JVM이 시작될 때 특성을 지정해야합니다. 기본 방법은 입력 된 시간, 캐릭터로의 부호화 String.getBytes()
및 기본 생성자 InputStreamReader
및 OutputStreamWriter
영구적으로 캐시되었습니다.
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
파일 에서 로케일을 올바르게 설정하면 도움이되었습니다.