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 클래스라는 지리적, 국가적, 문화적 지역을 나타내기 위한 클래스가 존재한다.
JVM 이 OS의 동작환경을 읽어서 OS의 환경설정 국가를 바라보게 되고,
그 정보를 기반으로 JVM 과 JAVA의 국가 설정이 결정한다.
이유
한국에서 설정되어 있으니 JVM 이 대한민국으로 인식하였고
EUC-KR 로 잡히게 되면서 .getBytes() 에 UTF-8 을 했을 때 깨지게 되고 EUC-KR 로 지정해줄 때 변환된 이유인 것 같다.
Spring을 사용하게 되면 기본 언어값을 설정해주고 사용하면 설정한 값을 읽게 되는 것 같다.
컴퓨터 동작 시작부터 코드에 영향도가 많은 영향도가 있다고 생각하니 CS 지식을 많이 키워나가야될 것 같다.
'공부' 카테고리의 다른 글
[HTTP] HTTP 상태 코드 내용 정리 (0) | 2024.08.04 |
---|---|
[ERROR] WSL 로컬 프로젝트 포트 안열리는 현상 (0) | 2024.07.08 |
[Ubuntu] 우분투에서 실행 중인 포트 확인 및 죽이기 (0) | 2024.04.01 |
[ERROR] macOS - ls: .: Operation not permitted 에러 (0) | 2024.04.01 |
[ERROR] bootImageBuild 시 open /cnb/buildpacks/... : no such file or directory (0) | 2024.03.27 |