UTF-8 웹페이지가 EUC-KR로 보일 때 PHP header로 해결하는 방법
페이지 정보

본문
UTF-8로 제작된 웹페이지가 브라우저에서 EUC-KR로 잘못 인식되어 한글이 깨지는 현상을 겪고 있는 운영자와 개발자를 위해, PHP header 함수를 이용해 문자셋을 강제로 지정하고 해결하는 방법을 알아봅니다.
웹페이지 인코딩 깨짐 원인
웹페이지가 UTF-8로 제작되고 HTML 상단에 meta 태그(charset=utf-8)가 지정되어 있더라도 한글이 깨지는 현상이 발생할 수 있습니다. 이는 브라우저가 HTML 문서를 해석할 때 서버에서 전송하는 HTTP 응답 헤더(Content-Type)를 HTML 내부의 meta 태그보다 우선시하기 때문입니다. 서버 설정에 의해 인코딩이 EUC-KR로 지정되어 있으면 meta 태그에 UTF-8을 명시해도 브라우저는 이를 무시하고 EUC-KR로 처리하여 한글이 깨지게 됩니다. 또한 서버의 기본 default_charset 설정 상태에 따라 브라우저가 인식하는 인코딩 결과가 달라질 수 있습니다.
PHP header를 이용한 UTF-8 인코딩 강제 설정 방법
웹페이지가 UTF-8로 제작되었음에도 브라우저에서 EUC-KR로 인식되어 한글이 깨지는 현상이 발생할 때는 HTML의 <meta> 태그 외에도 PHP 상단에 HTTP 헤더를 명시하여 문자셋을 강제할 수 있습니다.
적용 방법
PHP 파일의 최상단(HTML 태그, 공백, echo 출력 등 어떠한 데이터보다 앞선 위치)에 아래 코드를 추가합니다. 만약 출력물이 먼저 발생한 뒤에 header() 함수를 호출하면 'Headers already sent' 오류가 발생하며 헤더가 적용되지 않습니다.
<?php header("Content-Type: text/html; charset=utf-8");?>
적용 예시
<?php header("Content-Type: text/html; charset=utf-8");?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
주의사항 및 다음 행동
서버의 기본 default_charset 설정 상태나 환경에 따라 결과가 다를 수 있으므로, 코드를 적용한 뒤에는 웹페이지 소스 보기 및 브라우저 인코딩 설정이 UTF-8로 정상 출력되는지 확인해야 합니다.
인코딩 정상 출력 확인 방법
PHP header 함수를 적용한 후 웹페이지 소스와 브라우저에서 인코딩이 정상적으로 출력되는지 확인하려면 다음 단계를 거칩니다.
- 브라우저 개발자 도구 확인: 브라우저에서 페이지를 연 뒤 개발자 도구를 실행하고
Network탭으로 이동합니다. 문서 요청 항목을 선택한 후 응답 헤더(Response Headers)의Content-Type값에charset=utf-8이 올바르게 포함되어 전송되는지 확인합니다. - 페이지 소스 보기: 웹페이지 본문에서 마우스 우클릭 후 '페이지 소스 보기'를 선택하여 상단에
<?php header("Content-Type: text/html; charset=utf-8");?>코드가 포함되어 있는지, 그리고 HTML<head>내부의<meta http-equiv="content-type" content="text/html; charset=utf-8">태그가 정상적으로 위치하는지 확인합니다.
서버의 기본
default_charset설정 상태에 따라 결과가 다를 수 있으므로 위 항목들을 함께 점검해야 합니다.
PHP header를 이용한 UTF-8 인코딩 설정 방법
웹페이지가 UTF-8로 제작되었음에도 브라우저에서 EUC-KR로 인식되어 한글이 깨지는 현상이 발생할 때는 HTML의 <meta> 태그 외에 PHP 상단에 문자셋을 강제로 지정하는 헤더를 추가해야 합니다.
적용 방법
PHP 파일의 최상단(<html> 태그 출력 이전)에 아래 코드를 추가합니다.
<?php header("Content-Type: text/html; charset=utf-8");?>
적용 전후 예시
[ 변경 전 ]
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
[ 변경 후 ]
<?php header("Content-Type: text/html; charset=utf-8");?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
서버 설정 및 추가 점검 사항
서버의 기본 default_charset 설정 상태나 MySQL 입출력 인코딩(character_set) 상태에 따라 결과가 다를 수 있습니다. PHP header와 meta 태그를 적용했음에도 문제가 지속된다면 아래 사항을 함께 점검할 수 있습니다.
- php.ini 설정 확인:
default_charset = "UTF-8"설정이 올바르게 되어 있는지 확인합니다. - MySQL 인코딩 지정: 데이터베이스 연동 시 입출력 인코딩이 달라 문제가 발생하는 경우
mysql_query("set session character_set_connection=utf8;");등의 코드를 통해 연결 인코딩을 지정할 수 있습니다.
주의사항 및 다음 행동
코드를 추가한 후 웹페이지 소스 및 브라우저 인코딩 설정이 UTF-8로 정상 출력되는지 확인합니다.
상황별 인코딩 설정 및 확인 가이드
| 내 상황 | 우선할 판단 | 다음 행동 |
|---|---|---|
| UTF-8 웹페이지인데 브라우저에서 EUC-KR로 인식되어 한글이 깨짐 | HTML <meta> 태그 단독 사용을 넘어 PHP 상단 헤더 전송 방식 적용 필요 | PHP 파일 최상단에 <?php header("Content-Type: text/html; charset=utf-8");?> 추가 |
| PHP header 코드를 추가했으나 정상 출력 여부가 불확실함 | 서버의 기본 default_charset 설정 및 HTTP 응답 헤더 상태 확인 | 브라우저 개발자 도구의 Network 탭에서 Response Headers의 Content-Type 검증 |
실전 FAQ
Q. meta 태그에 utf-8을 선언했는데도 왜 한글이 깨지나요?
- 답변: HTML 문서 내의
<meta>태그만으로는 브라우저의 문자셋이 완전히 강제되지 않는 경우가 있습니다. 서버의 헤더 전송 방식이나 기본default_charset설정 상태에 따라 브라우저가 다른 인코딩으로 해석할 수 있으므로, PHP 상단에header("Content-Type: text/html; charset=utf-8");코드를 함께 선언해야 합니다.
Q. PHP header 선언 후에도 한글이 계속 깨질 때 추가로 확인할 점은 무엇인가요?
- 답변: PHP 파일 최상단에 헤더를 추가했음에도 문제가 지속된다면, MySQL 등 데이터베이스와의 연동 과정에서 입출력 인코딩(characterset)이 일치하는지 확인해야 합니다. 서버 환경이나 `defaultcharset` 설정에 따라 결과가 다를 수 있으므로 데이터베이스 연결 설정이나 파일 자체의 저장 인코딩(UTF-8 여부)을 함께 점검하는 것이 안전합니다.
함께 보면 좋은 글
참고자료
기타 참고자료
- dnjsrud.tistory.com — PHP 한글 깨짐 / UTF-8 을 EUC-KR 로 변환하기 :: CHOI 프로그래밍
- phpschool.com — PHPSCHOOL-Q&A > PHP관련/함수/프레임웍 질문과답변
- admd13.tistory.com — PHP 한글 깨짐 현상, 인코딩 해결방법
- m.blog.naver.com — 그누보드한글 깨짐 현상 / 인코딩 방식 : 네이버 블로그
- phpschool.com — PHPSCHOOL-Q&A > 리눅스/서버/설치/설정 질문과답변
- godogha9man.tistory.com — meta charset 설정이 잘못되면 깨집니다 – 실무에서 겪은 한글 인코딩 문제 해결기
- webdir.tistory.com — WEBDIR :: 리눅스 문자셋(charset) 설정
- 이전글그누보드 특정 분류별 최신글 출력 및 캐시 충돌 해결 방법 26.10.09
- 다음글PHP date 함수 시간 불일치 해결을 위한 타임존 설정 방법 26.10.08
댓글목록
등록된 댓글이 없습니다.