AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

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)과 문자셋 차이를 이해해 인코딩 오류 예방