Programing

기본 Java 문자 인코딩 설정

lottogame 2020. 3. 3. 22:50
반응형

기본 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);

이렇게하면 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.encodingJVM 에서 인수를 전달하려면 다음과 같이 실행해야합니다.

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



반응형