기본 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.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);
이렇게하면 charset이 설정되지 않았다고 생각하는 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
파일 에서 로케일을 올바르게 설정하면 도움이되었습니다.
Spring Boot를 사용하고 있고 file.encoding
JVM 에서 인수를 전달하려면 다음과 같이 실행해야합니다.
mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"
JTwig
템플릿 을 사용 하고 있었으며 운영 체제 ANSI_X3.4-1968
를 통해 알게 된 이후이 작업이 필요했습니다.System.out.println(System.getProperty("file.encoding"));
이것이 누군가를 돕기를 바랍니다!
나는 많은 것을 시도했지만 여기서 샘플 코드는 완벽하게 작동합니다. 링크
코드의 요점은 다음과 같습니다.
String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
당신이하는 일에 대해 명확하지 않으며이 시점에서 통제 할 수 없습니다. 대상 파일에 다른 OutputStream 클래스를 삽입 할 수있는 경우 기본적으로 UTF-8과 같이 정의한 문자 집합 아래에서 문자열을 바이트로 변환하는 OutputStream의 하위 유형을 사용할 수 있습니다. 수정 된 UTF-8이 필요에 충분하면 다음을 사용할 수 있습니다 DataOutputStream.writeUTF(String)
.
byte inbytes[] = new byte[1024];
FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
String in = new String(inbytes, "UTF8");
DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt"));
out.writeUTF(in); // no getBytes() here
이 방법을 사용할 수 없다면 여기에서 데이터 흐름 및 실행 환경과 관련하여 제어 할 수있는 것과 제어 할 수없는 것을 명확하게 설명하면 도움이 될 수 있습니다. 행운을 빕니다.
mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2
jenkins 작업을 구성하는 동안 명령이 exec-maven-plugin과 함께 작동하여 다음 오류를 해결했습니다.
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Error occurred during initialization of VM
java.nio.charset.IllegalCharsetNameException: "UTF-8"
at java.nio.charset.Charset.checkName(Charset.java:315)
at java.nio.charset.Charset.lookup2(Charset.java:484)
at java.nio.charset.Charset.lookup(Charset.java:464)
at java.nio.charset.Charset.defaultCharset(Charset.java:609)
at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:56)
at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:111)
at java.io.PrintStream.<init>(PrintStream.java:104)
at java.io.PrintStream.<init>(PrintStream.java:151)
at java.lang.System.newPrintStream(System.java:1148)
at java.lang.System.initializeSystemClass(System.java:1192)
두 가지 시스템 속성을 함께 설정하면 시스템이 모든 것을 utf8로 가져옵니다.
file.encoding=UTF8
client.encoding.override=UTF-8
허용 된 답변에 대한 @Caspar 의견에 이어 Sun에 따라이 문제를 해결하는 기본 방법은 다음과 같습니다.
"자바 프로그램을 시작하기 전에 기본 플랫폼의 로케일을 변경하십시오."
http://bugs.java.com/view_bug.do?bug_id=4163515
도커의 경우 다음을 참조하십시오.
http://jaredmarkell.com/docker-and-locales/
최근에 저는 현지 회사의 Notes 6.5 시스템에 부딪 쳤으며 웹 메일이 Zhongwen 이외의 지역화 된 Windows 설치에서 식별 할 수없는 문자를 표시한다는 것을 알았습니다. 온라인으로 몇 주 동안 파고 들었고 몇 분 전에 알아 냈습니다.
Java 특성에서 다음 문자열을 런타임 매개 변수에 추가하십시오.
-Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950
이 경우 UTF-8 설정이 작동하지 않습니다.
Amazon (AWS) Elastic Beanstalk를 사용하고 있으며 UTF-8로 성공적으로 변경했습니다.
Elastic Beanstalk에서 Configuration> Software, "Environment properties"로 이동하십시오. (값) -Dfile.encoding = UTF8을 사용하여 (이름) JAVA_TOOL_OPTIONS 추가
저장 후 환경은 UTF-8 인코딩으로 다시 시작됩니다.
우리 팀은 Windows를 사용하는 컴퓨터에서 같은 문제가 발생했습니다. 그런 다음 두 가지 방법으로 문제를 해결했습니다.
a) 환경 변수 설정 (Windows 시스템 환경 설정에서도)
JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF8
b) 다음 스 니펫을 pom.xml에 소개하십시오.
-Dfile.encoding=UTF-8
이내에
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8001
-Dfile.encoding=UTF-8
</jvmArguments>
참고 URL : https://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding
'Programing' 카테고리의 다른 글
g ++로 C ++ 11 컴파일 (0) | 2020.03.03 |
---|---|
저장소에서 파일을 제거하지만 로컬로 유지 (0) | 2020.03.03 |
numpy reshape에서 -1은 무엇을 의미합니까? (0) | 2020.03.03 |
실제로 Python 3.3의 새로운 "yield from"구문에 대한 주요 용도는 무엇입니까? (0) | 2020.03.03 |
표준 C ++에서 변수 유형을 인쇄 할 수 있습니까? (0) | 2020.03.02 |