Java

문자 인코딩

으엉어엉 2025. 6. 6. 15:15
728x90

개발자를 위한 문자 인코딩 완전정복 (UTF-8 중심)

실무에서 자주 마주치는 "한글 깨짐", "인코딩 오류" 문제를 해결하고 싶다면 이 글을 반드시 읽으세요.


1. 문자 인코딩이란?

컴퓨터는 기본적으로 0과 1로 이루어진 바이너리(이진수) 데이터만 처리할 수 있음.

  • 우리가 사용하는 "문자"는 컴퓨터가 이해할 수 없기 때문에, "숫자"로 바꾸는 규칙이 필요함 → 문자 인코딩(Charset)
  • 반대로 숫자를 문자로 바꾸는 걸 디코딩이라고 함

예:

  • 문자 'A' → 숫자 65 (ASCII 기준)
  • 문자 '가' → 다양한 인코딩에서 서로 다른 바이트로 표현됨

2. 주요 문자 인코딩 방식 비교

인코딩특징한글 지원ASCII 호환용량 효율

 

인코딩 특징 한글지원 ASCII호환 용량 효
ASCII 7bit, 영문만 표현 X V 최고 (1byte)
EUC-KR 2byte 한글 인코딩, 한국 전용  (2,350자만) V 좋음
MS949 EUC-KR 확장, 윈도우 한글 기본  (11,172자) V 좋음
UTF-16 2byte 고정 (기본 문자), 일부 4byte V X 보통~높음
UTF-8 1~4byte 가변, 국제 표준 V V 영문 기준 최고

 


3. 왜 UTF-8이 사실상 표준인가?

  • 전 세계 모든 문자 지원: 한글, 이모지, 고대문자까지 다 됨
  • ASCII 호환: 기존 시스템과 호환성 우수
  • 용량 절약: 영문은 1byte로, 한글은 3byte로 인코딩
  • 웹 표준 채택: HTML, JSON, XML, API 모두 기본 인코딩

 참고: 대부분의 웹 페이지는 UTF-8로 작성됨


4. 자바에서 문자 인코딩 다루기

String text = "가";
byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8);
byte[] eucKrBytes = text.getBytes(Charset.forName("EUC-KR"));

문자 인코딩 → 바이트 확인

System.out.println(Arrays.toString(utf8Bytes));
System.out.println(Arrays.toString(eucKrBytes));

자바 시스템 기본 문자셋 확인

Charset defaultCharset = Charset.defaultCharset();
System.out.println(defaultCharset);

Charset.forName("UTF-8") 으로 원하는 문자셋 지정 가능


5. 한글 깨짐의 핵심 원인

상황 원인 예시
UTF-8로 저장 → EUC-KR로 열기 서로 다른 인코딩 사용 '가' → '媛�' 깨짐
EUC-KR로 저장 → UTF-8로 열기 디코딩 실패 '뷁' 같은 복합 글자 깨짐
UTF-8/CP949 → ISO-8859-1로 디코딩 ISO는 한글 미지원 '?'로 보임

저장할 때와 읽을 때 인코딩이 같아야 깨지지 않음!

 

 

결론

  • 문자 인코딩은 개발자가 반드시 이해해야 할 핵심 개념입니다.
  • 지금은 무조건 UTF-8을 사용하는 게 안전하고 표준입니다.
  • 자바, 웹, DB, API 모두 UTF-8 기반으로 통일하면 한글 깨짐은 99% 예방 가능!

💡 인코딩은 복잡하지 않아요. 개념을 한 번만 정리하면, 실무에서 꽤 큰 에러를 미리 피할 수 있어요.

728x90

'Java' 카테고리의 다른 글

I / O 입출력  (1) 2025.06.06
접근 제한자  (0) 2025.03.26
Object Class  (0) 2025.03.24
참조형과 기본형  (0) 2025.03.23
리플렉션  (1) 2024.12.27