UTF-8 사이트 설정이 잘못되면 한글이 깨져 알 수 없는 기호로 표시됩니다. 이 문제의 핵심에는 거의 항상 문자 인코딩 불일치가 자리하고 있습니다. 원인과 해결 방법을 단계별로 정리합니다.
UTF-8 사이트란 무엇인가
UTF-8 사이트는 페이지의 텍스트를 UTF-8 방식으로 인코딩해 제공하는 웹사이트를 의미합니다. UTF-8은 유니코드 문자를 1바이트에서 4바이트까지 가변 길이로 저장하는 인코딩 표준으로, 한글, 영문, 한자, 이모지까지 거의 모든 문자를 하나의 체계 안에서 처리할 수 있습니다. 현재 전 세계 웹사이트의 98% 이상이 UTF-8을 사용하고 있으며, HTML5 표준이 권장하는 기본 인코딩도 UTF-8입니다.
사이트 글자가 깨지는 주요 원인
글자 깨짐 현상은 텍스트를 저장한 인코딩과 읽어 들이는 인코딩이 서로 다를 때 발생합니다. 대표적인 원인은 다음과 같습니다.
- HTML 문서에 문자셋 선언(meta charset)이 없거나 잘못 지정된 경우
- 웹 서버가 잘못된 Content-Type 헤더를 응답하는 경우
- 데이터베이스 테이블이나 컬럼의 캐릭터셋이 UTF-8이 아닌 경우
- 소스 파일 자체가 ANSI나 EUC-KR로 저장된 경우
- 외부 API나 업로드 데이터의 인코딩이 섞여 들어온 경우
UTF-8로 사이트 인코딩 설정하는 5가지 방법
인코딩 문제는 한 군데만 고쳐서는 해결되지 않는 경우가 많습니다. 아래 다섯 단계를 순서대로 점검하면 대부분의 글자 깨짐을 해결할 수 있습니다.
- HTML meta 태그 선언: 문서 head 최상단에
<meta charset="UTF-8">를 추가합니다. head 안에서 가장 먼저 나오도록 배치해야 합니다. - HTTP 응답 헤더 설정: 서버가
Content-Type: text/html; charset=UTF-8헤더를 보내도록 설정합니다. 헤더 설정은 meta 태그보다 우선 적용됩니다. - 파일 저장 인코딩 확인: 소스 파일을 BOM 없는 UTF-8로 저장합니다. 에디터에서 인코딩을 명시적으로 지정하는 것이 안전합니다.
- 데이터베이스 캐릭터셋 변경: MySQL 기준 테이블과 컬럼을
utf8mb4로 설정하고, 커넥션 캐릭터셋도 동일하게 맞춥니다. - 웹 서버 기본값 설정: Apache는
AddDefaultCharset UTF-8, Nginx는charset utf-8;지시어로 기본 인코딩을 통일합니다.
UTF-8 vs EUC-KR 차이점
아직 운영 중인 구형 사이트에서는 EUC-KR을 사용하는 경우가 있습니다. 두 방식의 차이를 이해하면 마이그레이션 판단에 도움이 됩니다.
| 구분 | UTF-8 | EUC-KR |
|---|---|---|
| 표현 가능 문자 | 전 세계 거의 모든 문자 | 한글, 영문, 일부 한자 중심 |
| 한글 1글자 크기 | 3바이트 | 2바이트 |
| 다국어 지원 | 우수 | 제한적 |
| 글로벌 호환성 | 국제 표준, 권장 | 국내 한정 |
| 이모지 지원 | 가능(utf8mb4) | 불가 |
사이트 인코딩 점검 방법
설정을 마쳤다면 실제로 올바르게 적용됐는지 확인해야 합니다. 다음 방법으로 교차 점검하면 신뢰할 수 있습니다.
- 브라우저 개발자 도구의 Network 탭에서 응답 헤더의 Content-Type 확인
- 페이지 소스 보기로 meta charset 선언 위치 확인
curl -I명령으로 서버 응답 헤더 직접 확인- 온라인 인코딩 검사 도구에 URL을 입력해 자동 진단
특히 한글, 특수문자, 이모지, 임의의 숫자 조합 등 다양한 테스트 문자열을 입력해 보며 깨짐 여부를 확인해야 합니다. 반복 테스트에 쓸 더미 데이터나 무작위 값이 필요할 때는 랜덤 숫자 생성기 같은 도구로 빠르게 샘플을 만들어 활용하면 편리합니다.