W3C 유효성 검사기에서 유효한 PHP를 사용하여 HTTP 헤더를 UTF-8로 설정하는 방법은 무엇입니까?


319

다음 코드를 사용하여 여러 가지 PHP 페이지를 HTML 페이지 로 에코 합니다.

<meta http-equiv="Content-type" content="text/html; charset=utf-8" />

그러나 W3C 유효성 검사기를 사용하여 유효성을 검사하면 다음 과 같은 결과가 나타납니다.

HTTP 헤더 (iso-8859-1)에 지정된 문자 인코딩이 요소의 값 (utf-8)과 다릅니다.

PHP를 처음 접했을 때 PHP 파일의 헤더를 HTML 파일과 일치하도록 변경할 수 있는지 궁금합니다.

답변:


897

headerHTTP 헤더를 수정하는 데 사용하십시오 .

header('Content-Type: text/html; charset=utf-8');

출력이 클라이언트로 전송되기 전에이 함수를 호출하십시오. 그렇지 않으면 헤더도 전송되었으며 더 이상 헤더를 변경할 수 없습니다. 로 확인할 수 있습니다 headers_sent. 자세한 내용은 매뉴얼 페이지header 를 참조하십시오.


4
HTTP 헤더를 이와 같이 올바르게 설정하면 <meta>태그가 더 이상 필요하지 않습니다 .
Jon

3
@ 존 : 나는 둘 다 사용합니다. HTTP와 동등한 기능 META은 HTML 문서가 HTTP를 통해로드되지 않을 때 (예 : 디스크에서) 사용됩니다.
Gumbo

6
이것은 정적 페이지를 위해 PHP를 실행하는 경우에만 작동합니다. utf-8로 html 파일을 저장해야합니다. 그렇게하면 파일의 시작 부분에 인코딩 된 BOM 문자 utf-8이 추가됩니다. 바이트 0xEF, 0xBB, 0xBF가 파일의 시작 부분에 추가되었습니다. 대부분의 웹 서버는이를 인식하고 적절한 헤더를 적용합니다. 실제로 PHP 파일을 utf-8로 저장하면 동일한 작업을 수행합니다.
Rahly

1
@Jeremy Walton : UTF-8 BOM이 추가되었다고해서 반드시 발생하는 것은 아닙니다. 실제로 UTF-8에는 1 바이트 순서 만 있기 때문에 UTF-8에는 필요하지 않습니다 (그러나 UTF-8을 식별하는 데 사용될 수 있음).
Gumbo

1
@ Gumbo : 물론, 여기서 단순화하고 가장 일반적인 웹 시나리오를 목표로하고 있습니다 (질문은이 시나리오에 대해 이야기하는 것 같습니다). 질문의 명백한 수준을 고려할 때, 언젠가 그것이 제공 할 수있는 이점이 무엇인지 이해하지 못하는 경우 어떻게해야합니까?
Jon


15

이것은 웹 서버가 정의한 것과 일치하지 않는 HTTP 헤더를 보내는 데 문제가 있습니다. 서버가 올바른 헤더를 보내도록하는 방법에 대한 지침은 이 페이지를 참조 하십시오 .

그렇지 않으면 PHP를 사용하여 헤더를 수정할 수도 있지만 이 코드를 사용하여 텍스트를 출력 하기 전에 수행 해야 합니다.

header('Content-Type: text/html; charset=utf-8');

PHP를 사용하여 헤더를 전송하는 방법에 대한 자세한 내용 은 헤더 기능 설명서를 참조하십시오 .


12

더 짧은 방법을 사용할 수도 있습니다.

<?php header('Content-Type: charset=utf-8'); ?>

RFC 2616을 참조하십시오 . 문자 세트 만 지정하는 것이 유효합니다.


이 옵션이 마음에 듭니다. 왜냐하면 콘텐츠 유형의 다른 부분을 별도로 설정할 수 있기 때문입니다 (예 : 텍스트 / 일반 페이지와 텍스트 / HTML 페이지가 있지만 모두 UTF8입니다). 이해가 정확합니까?
Eric Seastrand

1
RFC 2616에서 해당 방식을 지정하는 것이 유효하다고 말하는 부분을 찾을 수 없습니다. Content-Type = "Content-Type" ":" media-type그리고media-type = type "/" subtype *( ";" parameter )
AI0867

1
문자셋 만 지정하는 것은 유효하지 않습니다. RFC 2616 (어쨌든 더 이상 사용되지 않음) 또는 RFC 7231 (더 이상 사용되지 않음) 또는 다른 RFC에 따라 유효하지 않습니다. 참조 stackoverflow.com/questions/41994062/...
sideshowbarker

10

올바른 구현을 위해서는 일련의 사항을 변경해야합니다.

데이터베이스 (연결 직후) :

mysql_query("SET NAMES utf8");

// Meta tag HTML (probably it's already set): 
meta charset="utf-8"
header php (before any output of the HTML):
header('Content-Type: text/html; charset=utf-8')
table-rows-charset (for each row):
utf8_unicode_ci

4
데이터베이스가 사용자에게 반환되기 전에 PHP와 함께 사용하도록 구성된 기본 형식으로 데이터가 인코딩되므로 데이터베이스 연합은 PHP에서 생성 된 출력에 영향을 미치지 않습니다. 둘째, OP는 그가 MySQL을 사용하고 있다고 언급하지 않았습니다. 셋째, MyISAM은 구식이므로 수행중인 작업을 모르면 권장하지 않아야합니다. InnoDB가 새로운 기본값이 된 이유가 있습니다.
EWit

마지막으로 문자 인코딩을 설정하는 모든 장소의 전체 목록입니다.
Filip OvertoneSinger Rydlo

mysql_query ( "SET NAMES utf8"); 내 선택 쿼리가 문제를 해결하기 전에. 고마워 :)
Deepak Goswami

7

내부 인코딩을 사용하도록 설정된 경우 PHP는 자동으로 헤더를 보냅니다.

ini_set('default_charset', 'utf-8');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.