<meta charset =“utf-8”> vs <meta http-equiv =“Content-Type”>


1535

HTML5 Doctype의 문자셋을 정의하기 위해 어떤 표기법을 사용해야합니까?

  1. 짧은:

    <meta charset="utf-8" /> 
  2. 긴:

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

94
내용 유형 및 인코딩과 같은 것에 <meta> 태그를 사용하는 것은 매우 아이러니한데, 그 이유를 알지 못하면 메타 태그의 값을 얻기 위해 파일을 구문 분석 할 수 없기 때문입니다.
Mark

321
도달 할 때까지 ASCII로 구문 분석 할 수 있습니다. HTML5 파싱 알고리즘은이를 고려합니다.
Quentin

41
웹을 통해 페이지가 제공 될 때 구문 분석에 어느 것도 사용되지 않습니다. 대신 HTTP Content-Type응답 헤더에있는 것이 사용됩니다. 메타 태그는 페이지가 로컬 디스크 파일 시스템에서로드 될 때만 사용됩니다.
BalusC

38
메타 요소는 특정 조건 (HTTP 헤더에 데이터가없는 것을 포함)에서 HTTP를 통해 사용됩니다
Quentin

78
실제로 인코딩을 지정할 때 문자 세트라는 이름의 아이러니합니다. (문자셋은 유니 코드이고 인코딩은 UTF-8입니다)
Ryan

답변:


1084

HTML5에서는 동일합니다. 더 짧은 것을 사용하면 기억하고 입력하기가 더 쉽습니다. 브라우저 지원은 이전 버전과의 호환성을 위해 설계되었으므로 괜찮 습니다.


23
브라우저 지원은 어떻습니까? <meta charset='utf-8'>IE6 에서 작동 합니까 ?
Šime Vidas

11
내가 아는 한, 네
Quentin

4
@ Šime Vidas가 언급 한 Google 코드 페이지 의 업데이트 된 링크는 다음과 같습니다 . IE 6, 7, 8에 대해서는 "IE 이외의 브라우저에서는 document.characterSet을 사용할 수 있습니다. IE에서는 document.getElementsByTagName ( 'meta') [0] .charset을 사용할 수 있다고 생각할 수 있지만 "IE가 실제로 사용하는 인코딩이 아니라 지정한 문자 인코딩 만 반환합니다."
hotshot309

7
이 스레드는 오래 되었다는 것을 알고 있지만 gtmetrix.com/specify-a-character-set-early.html<meta>문자 인코딩을 설정하여 IE8에서 lookahead downloader를 비활성화하여 페이지로드 시간에 영향을 줄 수 있음을 나타냅니다 . 예, 알고 있습니다 ... IE8을 삭제하십시오. @ MészárosLajos는 몇 년 안에 다시 와서 IE8을 지원하기 위해 공을 터뜨릴 수 있습니다. ;-)
2

3
오늘 IE11에서 한국어 기호가 나타나지 않는 문제가있었습니다. 더 긴 구문을 위해 짧은 구문을 삭제하면 문제가 해결되었습니다. 이것이 일종의 서버 구성 때문인지 또는 IE11 및 문자 집합에 문제가 있는지 모르겠습니다. 실패한 정확한 기호 조합은 베라였습니다.
제임스 도넬리

250

메타 문자셋 선언 의 두 형태는 모두 동일하며 브라우저에서 동일하게 작동해야합니다. 그러나 웹 파일 문자 세트를 UTF-8로 선언 할 때 기억해야 할 사항이 몇 가지 있습니다.

  1. UTF-8 인코딩 파일 (들)을 저장 하지 않고 바이트 순서 표시 (BOM).
  2. 메타 문자셋을 사용하여 HTML 파일에서 인코딩을 선언하십시오 (위와 같이).
  3. 웹 서버 Content-Type HTTP 헤더에 UTF-8 인코딩을 선언하여 파일을 제공해야합니다.

Apache 서버는 기본적으로 ISO-8859-1의 파일을 제공하도록 구성되므로 .htaccess파일에 다음 줄을 추가해야 합니다.

AddDefaultCharset UTF-8

그러면 Content-Type 응답 헤더에서 UTF-8 인코딩을 선언하는 파일을 제공하도록 Apache가 구성되지만 파일 을 BOM없이 UTF-8로 저장 해야합니다 .

BOM이 없으면 메모장에서 파일을 UTF-8로 저장할 수 없습니다. 메모장 + + 인 무료 편집기입니다 . 프로그램 메뉴 표시 줄에서 "인코딩> BOM없이 UTF-8로 인코딩"을 선택하십시오. "인코딩> BOM없이 UTF-8로 변환"을 사용하여 파일을 열고 UTF-8로 다시 저장할 수도 있습니다.

Wikipedia의 BOM (Byte Order Mark) 에 대한 추가 정보 .


20
@CodeBoy " BOM없이 저장 해야합니다 "라는 답변을 수정하겠습니다 . 다음 페이지는 "... BOM을 생략하는 것이 일반적으로 상호 운용성에 가장 적합합니다 ..."라고 표시하지만 모범 사례는 아니지만 요구 사항은 아닙니다. w3.org/International/questions/qa-byte-order-mark
Johann

3
IIS에서는 Web.Config에서 <globalization fileEncoding = "utf-8"responseEncoding = "utf-8"/>을 사용하여 HTTP 헤더에 문자셋을 설정할 수 있습니다. <system.web>에 추가
Chris Moschini

3
내가 이해하기 때문에 BOM없이 우리와 함께 저장하면 전혀 중요하지 않습니다.
David 天宇 Wong

3
UTF-8 HTML에 BOM이 없어야하는 이유는 무엇입니까? BOM이 있으면 잘 작동합니다. 또한 metaHTTP 헤더 가 필요하지 않습니다 . BOM meta또는 HTTP 헤더 중 하나만 있으면 됩니다.
hsivonen

5
Summing up: don't use BOM for UTF-8나는 이것에 동의 할 수 없다. UTF-8의 BOM은 인코딩 유형을 시그널링하는 데 매우 유용합니다. 그렇지 않으면이 질문에서 언급 한 메타 태그와 같은 것을 추측하거나 사용해야합니다. BOM의 멋진 점은 BOM이 유니 코드 사양의 일부이므로 HTML뿐만 아니라 유니 코드로 인코딩 된 모든 데이터에 사용될 수 있다는 것입니다. 우리가 해야 할 일은 어디에서나 BOM을 사용하고, 레거시 소프트웨어를 폭파시키고, 버그를보고하고 수정하는 것입니다.
Stijn de Witt

82

짧은 것을 사용해야하는 또 다른 이유는 마크 업으로 문자 세트를 지정할 수있는 다른 인스턴스와 일치하기 때문입니다. 예를 들면 다음과 같습니다.

<script type="javascript" charset="UTF-8" src="/script.js"></script>

<p><a charset="UTF-8" href="http://example.com/">Example Site</a></p>

일관성은 오류를 줄이고 코드를 더 읽기 쉽게 만듭니다.

charset 속성은 대소 문자를 구분하지 않습니다. UTF-8 또는 utf-8을 사용할 수 있지만 UTF-8은 더 명확하고 읽기 쉽고 정확합니다.

또한 메타 문자 집합 속성 또는 페이지 헤더에서 UTF-8 이외의 다른 값을 사용하는 이유는 전혀 없습니다. UTF-8은 1999 년 HTML4 이후 웹 문서의 기본 인코딩이며 최신 웹 페이지를 만드는 유일한 실용적인 방법입니다.

또한 UTF-8에서 HTML 엔터티를 사용해서는 안됩니다. 저작권 기호와 같은 문자는 직접 입력해야합니다. 사용해야하는 유일한 엔티티는 5 개 예약 된 마크 업 문자 인 앰퍼샌드, 프라임, 더블 프라임입니다. 엔터티에는 항상 사용하지 않을 수도있는 HTML 파서가 필요합니다. 오류가 발생하거나 코드를 읽을 수 없게 만들고 파일 크기를 늘리며 사용하는 엔터티에 따라 다양한 브라우저에서 잘못 디코딩되는 경우가 있습니다. 저작권, 상표, 공개 견적, 가까운 견적, 아포스트로피, 엠 대시, 엔 대시, 글 머리 기호, 유로 및 기타 콘텐츠에서 발생하는 다른 문자를 입력 / 삽입하는 방법을 배우고 코드에서 실제 문자를 사용하십시오. Mac에는 키보드 시스템 환경 설정에서 켤 수있는 문자 뷰어가 있습니다. 필요한 문자를 찾아서 끌어다 놓거나 일치하는 키보드 뷰어를 사용하여 입력 할 키를 확인할 수 있습니다. 예를 들어, 상표는 Option + 2입니다. UTF-8은 모든 작성된 인간 언어의 모든 문자와 기호를 포함합니다. 따라서 em 대시 대신에 사용에 대한 변명이 없습니다. 구두점 및 활판 인쇄 규칙을 배우는 것도 나쁜 생각이 아닙니다.

content-type 및 encoding과 같은 것에 태그를 사용하는 것은 매우 아이러니한데, 그 사실을 알지 못하면 메타 태그의 가치를 얻기 위해 파일을 구문 분석 할 수 없었기 때문입니다.

아니요, 사실이 아닙니다. 브라우저는 파일을 브라우저의 기본 인코딩 (UTF-8 또는 ISO-8859-1)으로 구문 분석하기 시작합니다. US-ASCII는 ISO-8859-1 UTF-8 의 하위 집합이므로 브라우저는 어느 쪽이든 잘 읽을 수 있습니다 ... 동일합니다. 브라우저에 메타 문자 집합 태그가 있으면 인코딩이 브라우저에서 이미 사용중인 것과 다른 경우 브라우저는 지정된 인코딩으로 페이지를 다시로드합니다. 그렇기 때문에 메타 문자셋 태그를 맨 위, 헤드 태그 바로 다음에, 제목 앞에도 넣습니다. 그렇게하면 제목에 UTF-8 문자를 사용할 수 있습니다.

BOM없이 UTF-8 인코딩으로 파일을 저장해야합니다

그것은 사실이 아닙니다. 문서에 US-ASCII 문자 만있는 경우 US-ASCII로 저장하고 서브 세트이므로 UTF-8로 제공 할 수 있습니다. 그러나 유니 코드 문자가 있으면 올 바르면 BOM없이 UTF-8로 저장해야합니다.

UTF-8로 파일을 저장하는 좋은 텍스트 편집기를 원한다면 메모장 ++을 권장합니다.

Mac의 경우 Mac App Store에서 Bare Bones TextWrangler (무료) 또는 Mac App Store에있는 Bare Bones BBEdit를 $ 39.99에 사용하십시오. 어느 앱에서나 문서 창 하단에 문서 인코딩을 지정하는 메뉴가 있으며 "UTF-8 no BOM"을 쉽게 선택할 수 있습니다. 물론 환경 설정에서 새 문서의 기본값으로 설정할 수도 있습니다.

그러나 웹 서버가 HTTP 헤더에서 인코딩을 제공하므로 권장되는 [메타 태그]는 모두 불필요합니다.

맞지 않습니다. 물론 HTTP 헤더에서 인코딩을 설정해야하지만 메타 문자 세트 속성에서도 인코딩을 설정하여 사용자가 페이지를 브라우저에서 로컬 스토리지에 저장 한 다음 나중에 다시 열 수 있도록해야합니다. 존재할 인코딩의 유일한 표시는 메타 문자셋 속성이다. 같은 이유로 서버에서 기본 태그를 설정해야합니다 ... 기본 태그는 필요하지 않지만 로컬 저장소에서 열면 기본 태그를 사용하면 페이지가 서버에있는 것처럼 페이지가 모든 페이지와 함께 작동 할 수 있습니다 자산 등이 있고 끊어진 링크가 없음

AddDefaultCharset UTF-8

또는 다음과 같이 특정 파일 형식의 인코딩을 변경할 수 있습니다.

AddType text/html;charset=utf-8 html

UTF-8 및 Latin-1 (ISO-8859-1) 파일을 모두 제공하기위한 팁은 UTF-8 파일에 "텍스트"확장자를, 라틴 -1 파일에 "txt"를 제공하는 것입니다.

AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text

마지막으로, 레거시 DOS 나 (고전적인) Mac 라인 엔딩이 아닌 유닉스 라인 엔딩으로 문서를 저장하는 것을 고려하십시오. 특히 레거시 시스템에서 멀어 질수록 도움이되지 않습니다. 유효한 HTML5, UTF-8 인코딩 및 Unix 줄 끝이있는 HTML 문서는 잘 수행되었습니다. 여러 상황에서 해당 문서를 공유, 편집 및 저장하고 읽고 복구하며 신뢰할 수 있습니다. 링구아 프랑카입니다. 디지털 종이입니다.


20
"문서에 ISO-8859-1 문자 만있는 경우 ISO-8859-1로 저장하고 서브 세트이므로 UTF-8로 제공 할 수 있습니다."-올바르지 않습니다. "ISO-8859-1"을 "US-ASCII"로 변경하면 정확합니다. US-ASCII는 하위 집합이기 때문에 UTF-8과 호환되며 ISO-8859-1은 그렇지 않습니다. 비 ASCII 문자를 포함하는 ISO-8859-1을 UTF-8로 변환하려면 비 ASCII 문자를 인코딩해야합니다. ISO-8859-1의 코드 포인트는 유니 코드로 존재하지만 UTF-8은 US-ASCII 외부의 코드 포인트를 ISO-8859-1과 다르게 인코딩합니다.
thomasrutter 2016 년

2
HTML 엔터티에 대한 당신의 요점은 좋습니다. 과거에는 엔터티를 사용하여 다른 시스템에 저장하거나 다른 편집기에서 연 후에 UTF-8 문자로 변환 한 것을 발견했습니다. 그러나 비 공백 공간 (& nbsp;)은 일반적으로 편집기에서 결과를 볼 수 없으므로 명확하게하기 위해 엔티티로 유지하는 것이 가장 좋습니다 (제 경험상).
squidbe

"You should also set a base tag..."여기에 설명 된 경고와 함께 제공되어야 합니다 .
Mafuba

HTML 엔티티를 선호하는 또 다른 이유는 ionicons 와 같은 것을 사용하는 것 입니다. 차라리 &#xf101;기본 글리프 또는 내가 인식하지 못하는 이상한 문자보다 보입니다 .
Daniel Lubarov

30

<meta charset="utf-8"> HTML5와 함께 /를 위해 소개되었습니다.

문서에서 언급했듯이 둘 다 유효합니다. 그러나 <meta charset="utf-8">HTML5 전용이며 입력 / 기억하기 쉽습니다.

머지 않아 구식 스타일은 가까운 장래에 폐기 될 예정입니다. 나는 새로운 것을 고수했다 <meta charset="utf-8">.

한 가지 방법이 있지만 위로 올라갑니다. 기술의 경우, 그것은 오래된 것을 단계적으로 폐지하고 있습니다 (실제로 정말 빠릅니다)

설명서 : HTML 메타 문자 집합 속성 —W3Schools


2
링크에 관해서는, 참조하시기 바랍니다 meta.stackoverflow.com/questions/280478/why-not-w3schools-com
tripleee

18

다른 답변에 대해서는 이의를 제기하지 않지만 다음 내용은 언급 할 가치가 있다고 생각합니다.

  1. "긴"( http-equiv) 표기법과 "짧은"표기법은 동일하며, 먼저이기는 것입니다.
  2. 웹 서버 헤더는 모든 <meta>태그를 무시 합니다.
  3. BOM (바이트 순서 표시)은 everything 을 무시 하고 많은 경우 html 4 (및 아마도 다른 것들에도 영향을 미칩니다);
  4. 인코딩을 선언하지 않으면 브라우저에 정의 된 "대체 텍스트 인코딩"으로 텍스트가 표시 될 수 있습니다. Firefox와 Chrome 모두 utf-8이 아닙니다.
  5. 다른 단서가 없으면 브라우저는 마치 ASCII로 된 것처럼 문서를 읽어서 인코딩을 시도하므로 이상한 인코딩을 사용할 수 없습니다 (But과 함께 UTF-16).
  6. 사양에 따르면 인코딩 선언은 문서의 처음 512 바이트 내에 있어야한다고 말하지만 대부분의 브라우저는 그 이상을 읽으려고 시도합니다.

echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500에서 브라우저를 실행 하고 가리켜 서 테스트 할 수 있습니다 localhost:4500. 물론 부품을 변경하거나 제거 할 수도 있습니다. BOM 부품은 \xef\xbb\xbf. 쉘 인코딩에주의하십시오.

인코딩을 명시 적으로 선언하는 것이 매우 중요합니다. 브라우저가 추측하도록하면 보안 문제가 발생할 수 있습니다.


1
좋은 지적이지만 어떤 보안 문제를 언급하고 있습니까?
Armfoot

1
긴 표기법이 짧은 표기법을 재정의해서는 안됩니다. 단순히 문서의 첫 표기법이 우선합니다.
gsnedders

1
@Armfoot 과거에는 UTF-7내가 기억하는 것에서 문제가있었습니다 . 또한 웹에서 스니핑하는 것은 일반적으로 예를 들어 스크립트 콘텐츠로 스니핑 된 이미지를 업로드 할 때 좋지 않습니다.
phk

@gsnedders는 크롬과 파이어 폭스에서 테스트되었습니다. 이에 따라 답변을 편집했습니다. Armfoot : 약 7 비트 인코딩에 관한 것이 었습니다. 정확히 무엇을 기억하지 마십시오.
다람쥐

1
@CraigMcQueen은 브라우저 폴백 (2018 년)이 여전히 서유럽의 서유럽으로 기본 설정되어 있다고 확신하므로 각 지역에서 지배적 인 프리 유니 코드 인코딩이 무엇인지 기본값으로 생각합니다. 사용자는 폴백을 utf-8로 설정할 수 있지만 이로 인해 수천 개의 사이트가 여전히 결함이있는 높은 바이트 ASCII 문자로 여전히 사용되는 모든 크 래피 인코딩을 노출하므로 여전히 흔하지는 않습니다. 더 안타깝습니다. 브라우저 공급 업체의 약간의 강요없이 이것이 어떻게 변할 지 알 수 없으며 레거시를 깨는 데 열중하지 않습니다.
brennanyoung

13

<meta charset="utf-8" />HTML5를 사용할 때 웹 브라우저에 사용하십시오 .

사용 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />HTML4 또는 XHTML을 사용하거나 같은 오래된 DOM 파서에 대한 DOMDocumentPHP 5.3



1

전자 메일에 서명을 포함하려면 긴 버전을 사용합니다.

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

그 이유는 많은 전자 메일 독자가 html5를 사용하지 않기 때문에 항상 오래된 HTML 스타일을 사용하는 것이 좋습니다. 실제로 divs + css보다 테이블을 사용하는 것이 좋습니다.

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