서버 컨텐트 유형 헤더에 상관없이 HTML 웹 사이트의 문자 인코딩을 브라우저에 알리는 방법은 무엇입니까?


9

디스크의 물리적 인코딩이 올바르게 일치하는 HTML 페이지에 Content-Type을 알리는 HTML 페이지가 있습니다 .

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8">
    <title> ...

브라우저 (Google Chrome, Firefox)의 디스크에서 파일을 열면 정상적으로 작동합니다.

HTTP를 통해 요청하면 웹 서버는 다른 Content-Type 헤더를 보냅니다.

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 10:57:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1

(마지막 줄 참조). 그런 다음 브라우저는 ISO-8859-1 을 사용 하여 원하지 않는 결과를 표시합니다.

HTML 문서 내에서 서버 헤더를 브라우저로 보내는 것을 대체하는 일반적인 방법이 있습니까?

답변:


6

"HTML 문서 내에서 서버 헤더를 브라우저로 보내는 것을 대체하는 일반적인 방법이 있습니까?"

AFAIK 아니오, 당신은 이미 할 수있는 일을합니다. 헤더를 통한 정의 된 문자 집합은 META 태그에서 정의를 우선합니다.

서버 (예 : Apache)에 액세스 할 수있는 경우이 명령문으로 구성됩니다 (주석 참조).

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

[최신 정보]

두 번째 w3d의 의견 에 대해서는 Apache 서버의 htaccess-Directives 를 통해 문자 세트를 변경하는 방법을 찾을 수 있습니다 .


2
+1 HTTP 헤더는 HTML 메타 태그보다 우선합니다. @hakre가 서버 측에 액세스 할 수 있으면 페이지 단위로 Content-Type 헤더를 무시할 수도 있습니다.
MrWhite

3
마우스 오른쪽 단추로, 여기에 인용 규격이다 그 지정 HTTP 헤더 비장의 메타 태그 : w3.org/TR/REC-html40/charset.html#h-5.2.2
유카 K. 펠라

답변 해주셔서 감사합니다. @ Korpela : 예, HTML 사양을 가진 메모리에 있습니다. 내가 :( 필요로 정확히 다른 방법 라운드입니다.
hakre

.htaccess와 관련하여 (죄송합니다. 이것은 새로운 질문 일 것입니다), ;charset=...http 헤더에서도 를 제거 할 수 있습니까? 이 사이트는와 잘 작동 Content-Type: text/html하며 서버마다 파일마다 인코딩이 다릅니다. (나는 몇 주 전에 그것을 찾았지만 결과가 완전히 최종적이지 않았기 때문에 이것이 불가능하다는 것을 두려워합니다). 만일 당신이 바로 약간의 빛을 비출 수있는 경우를 대비하여.
hakre

@hakre Apache의 ForceType 지시문이 효과가있는 경우 <Files> 컨테이너에 배치하고 개별적으로 파일 또는 특정 디렉토리의 이름을 지정하십시오. MIME 유형 다음에 "; charset ="부분을 남겨두면됩니다.
initall

3

루트 .htaccess에 이와 같은 것을 설정해야합니다.

<FilesMatch "\.(htm|html|xhtml|xml|php)$">
    AddDefaultCharset utf-8
</FilesMatch>

3

아니요, HTML 내에서는 불가능합니다. 서버 응답 헤더가 문서의 메타 태그보다 우선합니다. 5.2.2에 지정된대로 문자 인코딩 지정-HTML 4.01 Specification :

요약하면, 적합한 사용자 에이전트는 문서의 문자 인코딩을 결정할 때 다음 우선 순위를 준수해야합니다 (가장 높은 우선 순위에서 가장 낮은 우선 순위로).

  1. "Content-Type"필드의 HTTP "charset"매개 변수
  2. "http-equiv"가 "Content-Type"으로 설정되고 "charset"에 대한 값이 설정된 META 선언.
  3. 외부 자원을 지정하는 요소에 설정된 문자 세트 속성

따라서 서버 측에서 구성해야합니다. 그러나 장이 계속됨에 따라 :

사용자 에이전트는 사용자가 잘못된 "문자 세트"정보를 무시할 수있는 메커니즘을 제공 할 수 있습니다. 그러나 사용자 에이전트가 이러한 메커니즘을 제공하는 경우 잘못된 "charset"매개 변수로 표시된 웹 페이지가 작성되는 것을 피하기 위해 편집 용이 아닌 탐색 용으로 만 제공해야합니다.

필자의 경우 서버의 Content-Type 헤더에는 올바른 mime-type 이지만 잘못된 charset이 있습니다.

결과적으로 내 Apache httpd 구성이 부품 AddDefaultCharset을 추가하는 켜기를 설정했습니다 ; charset=ISO-8859-1. 웹 사이트 루트 디렉토리 .htaccess에 다음 줄을 배치하십시오 .

AddDefaultCharset Off

문자셋 정보가 제거되었습니다 :

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 15:07:52 GMT
...
Content-Type: text/html

(마지막 줄 참조 ; charset=...). 이것은 html 메타 태그와 결합하여 상기 브라우저 휴리스틱 이 메타 태그로부터 캐릭터 셋 을 인계하도록 트리거한다 . 웹 사이트가 올바르게 디코딩되었습니다.

로 테스트 :

  • 구글 크롬 v. 22.0.1229.94
  • Firefox v. 16.0.1
  • Lynx 버전 2.8.7rel.1 (2009 년 7 월 5 일)

이 세 가지 브라우저는 원래 구성에 문제가 있었고 현재 작동합니다 (모두 Fedora 17에서).

  • 오페라 12.02
  • Internet Explorer 6 (Win XP SP3)

처음에는 문제가 없었습니다. 둘 다 서버 의 ISO-8859-1 설정 보다 메타 태그에서 UTF-8 을 선호했습니다 .

  • 넷스케이프 2.01 골드

UTF-8을 지원하지 않으므로 서버 설정 및 메타 태그에 관계없이 항상 Western (Latin1)을 선택 합니다.


1

여기에 말한 것 외에도 모든 페이지에서 동일한 문자 세트를 사용하려고합니다. UTF-8(거의 모든 것이 iso-8859-1인 경우 이것을 사용하십시오)

파일의 문자셋을 빠르게 확인하려면 다음을 시도하십시오.

file --mime-type --mime-encoding {filename}

트리에있는 모든 파일의 문자 세트를 확인하려면 다음을 시도하십시오.

find . -type f -exec file --mime-type --mime-encoding '{}' \;

또는 ( file명령을 한 번만 호출 ) :

find . -type f -print | file --mime-type --mime-encoding -f-

요약을 얻으려면 명령에 -b옵션을 사용하여 file(파일 이름을 생략하고) 결과를로 파이프하십시오 sort | uniq -c.

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