[JAVA] getByte() 를 할 때 UTF-8로하면 한글이 깨지고 EUC-KR 로 하면 변환될까?

 

 

단순 LOG 출력으로 2시간 깨짐..

 

LOG를 찍는 코드를 작성하고 구동하고 콘솔을 보는데 계속 한국어가 깨지는 현상이 발생했다.
IntellJ 문자 인코딩 설정인 줄 알고 계속 이것저것 만지다가 아닌 걸 깨닫고 LOG를 출력하는 부분을 들여다 보았다.

맨처음에는 UTF-8 로 계속 변환을 해주고 있었는데 안되니까 EUC-KR 로 변환해주니 한글로 잘 출력이 되었다.

이러한 현상에 대해 궁금해서 찾아보다가 재밌는 사실을 발견해서 작성해본다.

 

 

 

 

UTF-8 과 EUC-KR가 뭔지 알아보자.

 

UTF-8 과 EUC-KR 은 문자 인코딩 방식 중 하나이며 그 중 한글을 표현할 수 있는 인코딩 방식이다.

 

UTF-8 이란 ?

유니코드를 위한 가변 길이 문자 인코딩 방식

1 Byte ~ 4 Byte 까지 사용하며 가변적으로 사용함

 

EUC-KR 이란 ? 

고정 길이 한글 인코딩 방식

2 Byte 로 고정적으로 사용함. 

 

간단하게 정리하고 깊은 내용은 따로 정리해 볼 생각이다.

 

 

내가 발견했던 부분은 아래의 내용이다.

 

 

Socket 에 적재했던 내용들을 출력하는 부분인데

byte  배열로 구성되어 있어 해당 부분을 가져와 String 으로 변환해서 출력하는 코드이다.

 

- 기본 출력 - 한글 깨짐

byte[] byteArray = logContent ..; // 해당 LOG 내용

LOGGER.INFO("LOG : {} ",new String(byteArray.getBytes())); // 한글 깨짐


- UTF 인코딩 (한글 깨짐)

byte[] byteArray = logContent ..; // 해당 LOG 내용

LOGGER.INFO("LOG : {} ",new String(byteArray.getBytes(StandardCharsets.UTF-8))); // 한글 깨짐

 

- EUC-KR (한글 출력)

byte[] byteArray = logContent ..; // 해당 LOG 내용

LOGGER.INFO("LOG : {} ",new String(byteArray.getBytes(Charset.forName("EUC-KR")); // 한글 출력

 

 

왜 깨지는 건가?

 

깨지는 이유는 결국 인코딩과 디코딩의 방식이 달라서 한글이 깨지는 건데  왜 UTF-8로 설정을 해줬는데도 깨지는걸까?

 

JVM 과 Java Locale 클래스

 

Java 에서 기본적으로 제공해주는 Locale 클래스라는 지리적, 국가적, 문화적 지역을 나타내기 위한 클래스가 존재한다.

 

 

Locale (Java Platform SE 8 )

getDisplayLanguage public String getDisplayLanguage(Locale inLocale) Returns a name for the locale's language that is appropriate for display to the user. If possible, the name returned will be localized according to inLocale. For example, if the locale

docs.oracle.com

 

 

 

JVM 이 OS의 동작환경을 읽어서 OS의 환경설정 국가를 바라보게 되고,

그 정보를 기반으로 JVM 과 JAVA의 국가 설정이 결정한다.

 

 

 

이유

한국에서 설정되어 있으니 JVM 이 대한민국으로 인식하였고

EUC-KR 로 잡히게 되면서 .getBytes() 에 UTF-8 을 했을 때 깨지게 되고 EUC-KR 로 지정해줄 때 변환된 이유인 것 같다.

 

Spring을 사용하게 되면 기본 언어값을 설정해주고 사용하면 설정한 값을 읽게 되는 것 같다.

 

컴퓨터 동작 시작부터 코드에 영향도가 많은 영향도가 있다고 생각하니 CS 지식을 많이 키워나가야될 것 같다.