HTTP 헤더에 어떤 문자 인코딩을 사용해야합니까?


122

HTTP 헤더에 "재미있는"HTML 특수 문자 (✰) (자세한 내용은 http://html5boilerplate.com/ 참조 )를 사용하고 있으며 Server사양에 따라 "허용"되는지 궁금합니다.

  • Windows Xp Pro SP 3에서 Chrome의 개발 도구에있는 네트워크 탭을 사용하면 ✰ 괜찮아 보입니다.

  • IE8에서는 ✰가 올바르게 렌더링 되지 않습니다 .

  • w3.org HTML 유효성 검사기가 올바르게 렌더링 하지 않습니다 ( â°대신 " " 표시 ).

이제 저는 문자 인코딩에 너무 관심이 없습니다. 솔직히 저는 그것들에 대해별로 신경 쓰지 않습니다. 나는 내가 말한 UTF-8 cus를 맹목적으로 사용합니다. :-)


다른 파서 / 브라우저 / 엔진 / (무엇이든지간에)의 버그로 인해 불균형이 발생합니까?

이것에 대한 사양이 있습니까 아니면 HTTP 헤더 "값"에 허용되는 문자 목록이 있습니까?


29
이 질문은 일반적으로 "http 헤더 값에 허용되는 문자"를 훨씬 더 잘 묻는 것입니다.
Akrikos


2
"이제 저는 문자 인코딩에 너무 관심이 없습니다 ... 그리고 솔직히 저는 그것들에 대해별로 신경 쓰지 않습니다. 그냥 무작정 UTF-8 cus를 사용합니다. :-)"<--- - 에 필수 링크 joelonsoftware.com/2003/10/08/...
d4nyll

답변:


124

간단히 말해서 ASCII 만 작동합니다. 일부 비 ASCII 바이트는 이전 버전과의 호환성을 위해 허용되지만 표시 할 수는 없습니다.

HTTPbis는 포기 하고 헤더에 ASCII 외에 유용한 인코딩이 없다고 지정했습니다.

역사적으로 HTTP는 ISO-8859-1 문자 세트 [ISO-8859-1]의 텍스트가있는 필드 컨텐츠를 허용했으며, [RFC2047] 인코딩을 통해서만 다른 문자 세트를 지원했습니다. 실제로 대부분의 HTTP 헤더 필드 값은 US-ASCII 문자 집합 [USASCII]의 하위 집합 만 사용합니다. 새로 정의 된 헤더 필드는 필드 값을 US-ASCII 옥텟으로 제한해야합니다 (SHOULD). 수신자는 필드 내용 (obs-text)의 다른 옥텟을 불투명 한 데이터로 취급해야합니다.


이전에 1999 년의 RFC 2616은 다음과 같이 정의했습니다.

* TEXT의 단어는 RFC 2047 [14]의 규칙에 따라 인코딩 된 경우에만 ISO-8859-1 [22] 이외의 문자 집합의 문자를 포함 할 수 있습니다.

RFC 2047은 MIME 인코딩 이므로 다음과 같습니다.

=?UTF-8?Q?=E2=9C=B0?=

그러나 나는 많은 (있는 경우) 클라이언트가 그것을 지원한다고 생각하지 않습니다.


7
그래서 그게 무슨 뜻입니까? "✰"가 유효 / 허용됩니까?
David Murdoch

8
매우 유용한 답변에 대해 조금 확장하려면 : "UTF-8"은 문자 집합이고 "Q"는 값이 "인용 인쇄 가능"임을 의미합니다. 값을 BASE64로 인코딩하려는 경우 "B"를 사용할 수도 있습니다.
GargantuChet

1
@porneL, "불투명 한 데이터"는 무엇을 의미합니까? 이러한 "불투명 한 데이터"를 수신 때 HTTP 수신자 정확히 무엇을 해야 합니까?
Pacerier 2014

1
@Pacerier "불투명 한 데이터"는 응용 프로그램이 표시하거나 해석하지 않아야하는 바이트가 많은 블랙 박스라는 의미입니다 (예 : 바이너리 데이터). 어떤 일이 발생하는지는 헤더에 따라 다르며 "nothing"에서 "discard"까지 다양합니다.
Kornel 2014

@Kornel, Btw 사용자 이름을 kornel로 변경 한 이유는 무엇입니까?
Pacerier

10

먼저 의견을 읽으십시오.이 답변은 올바른 출처에서 잘못된 결론을 도출 할 수 있으며 편집이 필요합니다.


인쇄 가능한 ASCII 문자를 사용할 수 있으며 ✰와 같은 특수 문자는 사용할 수 없습니다 ( ASCII 가 아님 ).

: 모든 것을 JSON으로 인코딩 할 수 있습니다.

편집 : 처음에는 명확하지 않을 수 있습니다. 헤더에 정의 된 문자 인코딩은 헤더 자체가 아닌 응답 본문에만 적용됩니다. (닭과 계란 문제를 일으킬 수 있기 때문입니다.)


Penchant가 링크 한 스펙에 따라 모든 관련 정의를 요약하고 싶습니다 .

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )

그래서 우리는 field-value 뒤에 있습니다 .

LWS            = [CRLF] 1*( SP | HT )
CRLF           = CR LF
CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>

LWS는 Linear White Space를 나타냅니다. 기본적으로 LWS는 공백 또는 탭이지만 공백 또는 탭 앞에 새 줄을 시작하여 필드 값을 여러 줄로 나눌 수 있습니다.

이를 단순화 해 보겠습니다.

field-value    = <any field-content or Space or Tab>

이제 우리는 field-content 뒤에 있습니다 .

field-content  = <the OCTETs making up the field-value
                 and consisting of either *TEXT or combinations
                 of token, separators, and quoted-string>
OCTET          = <any 8-bit sequence of data>
TEXT           = <any OCTET except CTLs,
                 but including LWS>
CTL            = <any US-ASCII control character
                 (octets 0 - 31) and DEL (127)>
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
                 | "," | ";" | ":" | "\" | <">
                 | "/" | "[" | "]" | "?" | "="
                 | "{" | "}" | SP | HT

TEXT는 가장 일반적이며 나머지는 모두 포함하므로 나머지는 잊어 버리십시오. 다음은 US-ASCII 문자 집합 (= ASCII)입니다.

보시다시피 인쇄 가능한 모든 ASCII 문자가 허용됩니다.


3
당신은 인용 한 구절 과 모순 됩니다. 왜 "✰와 같은 특수 문자는 없습니다"라고 말합니까? 특수 문자는있는 OCTETS 및 때문에 TEXT어느 하나 OCTET를 제외하고 0 - 31이 수단, 모든 것을 OCTET에서의 32에이 255 허용됩니다 . ✰의 8 진수는 226, 156이며 176세 개 모두 허용되므로 인용 한 구절에 따라 ✰가 허용됩니다.
Pacerier 2014

2
@Pacerier 당신은 완전히 옳은 것 같습니다. 왜 내가 결론을 내 렸는지 모르겠습니다.
zupa

@Pacerier 아직 사양을 다시 확인해야했기 때문에 편집 할 준비가되지 않았습니다. 추가 세부 사항이 US-ASCII 문자 집합으로 제한되어 결론을 뒷받침하지만 추론이 불충분합니다.
zupa 2014

1
"JSON으로 인코딩 할 수있다"는 말은 약간 오해의 소지가 있습니다. JSON은 유니 코드 문자를 허용하지만 HTTP 헤더는 US-ASCII 여야합니다. 유니 코드 문자는 "불투명 한"데이터로 처리되므로 HTTP 사양에 의해 동작이 정의되지 않습니다. 즉, JSON은 \ uXXXX 이스케이프 시퀀스를 통해 유니 코드 문자를 이스케이프하여 HTTP 헤더에 안전하게 포함 할 수 있습니다.
Jacob

@zupa, 또 다른 문제는 ... " exceptCTLs "는 무엇을 의미합니까? 이 문자를 의미 하는가 CR, LF허용? 아니면 의미하지 연속 순서를 " CR LF SP/ HT"허용? (즉, 값이 하나 포함 헤더 수 CR또는 LFHT? 캔 헤더 값이 문자를 포함 CR, LF그리고 HT? 어떤 순서와 양)
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.