Hangul Unicode 인코딩 문제와 대체 문자(U+FFFD) 발생 원인 분석
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 웹 개발자: 인코딩 문제로 인한 특수 문자 처리
- UTF-8/Unicode 이해 필요자: 인코딩 방식과 문자셋 차이점
- 한국어 텍스트 처리 개발자: euc-kr, cp949, UTF-8 간 호환성 문제 해결
핵심 요약
- 문제의 핵심:
euc-kr
인코딩의 한글 문자셋 한계로 인해U+FFFD
대체 문자 발생 - UTF-8 vs euc-kr:
euc-kr
은 2,350개 한글 문자만 포함, UTF-8은 11,172개 한글 음절 지원 - JavaScript의 역할:
euc-kr
문서를 처리할 때 UCS-2(UTF-16)로 변환해U+FFFD
생성
섹션별 세부 요약
1. `euc-kr` 인코딩의 한계
- 문제의 근본 원인:
euc-kr
이 1987년 기준 2,350개 한글 문자만 포함 - 실제 사용 사례: 한글 이름 '서설믜' 등이
euc-kr
범위 외 문자로 인해 시스템 오류 발생 - 기타 문제: 한글 815 에디터에서 'ㅆ'+'ㅠ' 입력 시 동작 중단
2. `cp949` 인코딩 도입과 문제점
- 해결책:
cp949
로 2,350개 외 한글 문자 포함 - 문제점:
cp949
의 알파벳 정렬 순서 오류 (기호, 숫자, 알파벳 순서 변경) - 실제 적용: HTML 메타 태그는
euc-kr
으로 저장되지만 브라우저는cp949
로 처리
3. UTF-8과 JavaScript의 문자 처리 방식
- UTF-8 특징: 1~4바이트 가변 길이 인코딩, 한글은 3바이트 사용
- JavaScript 내부 처리: UCS-2(UTF-16)로 문자 저장, BMP 외 문자는 4바이트 처리 (이모티콘 등)
- 문제 사례:
euc-kr
문서를 JavaScript 변수에 저장 시 UCS-2로 변환해U+FFFD
생성
4. `U+FFFD` 대체 문자 발생 원인
- Unicode 정의:
U+FFFD
는 인식 불가능한 문자 대체용, UTF-8 처리 중 분할 시 생성 - 구체적 사례: 1,000바이트 단위로 분할된 UTF-8 데이터 스트림에서 3바이트 한글 문자 분할 시 발생
- 해결 방법: 멀티바이트 문자 분할 방지 로직 추가
결론
- 실무 적용 팁: UTF-8 데이터 스트림 처리 시 멀티바이트 문자 분할 방지
- 예시:
euc-kr
문서를 UTF-8로 전환 후 JavaScript 처리 - 핵심: 인코딩 방식(UTF-8 vs euc-kr)과 문자셋 차이를 이해해 인코딩 오류 예방