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