รูปแบบสำหรับส่วนหัว HTTP ถูกกำหนดไว้ในข้อมูลจำเพาะ HTTP ฉันจะพูดคุยเกี่ยวกับ 1.1 HTTP ซึ่งสเปคเป็นRFC 2616 ในส่วน 4.2 'ส่วนหัวของข้อความ' จะมีการกำหนดโครงสร้างทั่วไปของส่วนหัว:
message-header = field-name ":" [ field-value ]
field-name = token
field-value = *( field-content | LWS )
field-content = <the OCTETs making up the field-value
and consisting of either *TEXT or combinations
of token, separators, and quoted-string>
คำจำกัดความนี้วางอยู่บนสองเสาหลักโทเค็นและ TEXT ทั้งสองถูกกำหนดไว้ในส่วน 2.2 'กฎพื้นฐาน' โทเค็นคือ:
token = 1*<any CHAR except CTLs or separators>
ในทางกลับกันวางบน CHAR, CTL และตัวคั่น:
CHAR = <any US-ASCII character (octets 0 - 127)>
CTL = <any US-ASCII control character
(octets 0 - 31) and DEL (127)>
separators = "(" | ")" | "<" | ">" | "@"
| "," | ";" | ":" | "\" | <">
| "/" | "[" | "]" | "?" | "="
| "{" | "}" | SP | HT
TEXT คือ:
TEXT = <any OCTET except CTLs,
but including LWS>
โดยที่ LWS คือ white space เชิงเส้นซึ่งคำจำกัดความฉันจะไม่ทำซ้ำและ OCTET คือ:
OCTET = <any 8-bit sequence of data>
มีหมายเหตุประกอบคำนิยาม:
The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].
ดังนั้นสองข้อสรุป ประการแรกเป็นที่ชัดเจนว่าชื่อส่วนหัวจะต้องประกอบด้วยชุดย่อยของอักขระ ASCII - ตัวอักษรและตัวเลขเครื่องหมายวรรคตอนบางอย่างไม่มาก ประการที่สองไม่มีอะไรในคำจำกัดความของค่าส่วนหัวที่ จำกัด ไว้ที่ ASCII หรือยกเว้นอักขระ 8 บิต: ประกอบด้วย octets อย่างชัดเจนโดยมีเฉพาะอักขระควบคุมห้าม (หมายเหตุว่า CR และ LF ถือว่าเป็นตัวควบคุม) นอกจากนี้ความคิดเห็นเกี่ยวกับการผลิต TEXT ก็หมายความว่า octets จะถูกตีความว่าอยู่ใน ISO-8859-1 และมีกลไกการเข้ารหัส (ซึ่งน่ากลัวมากโดยบังเอิญ) สำหรับการแสดงอักขระนอกการเข้ารหัสนั้น
ดังนั้นเพื่อตอบสนองต่อ @BalusC โดยเฉพาะมันค่อนข้างชัดเจนว่าตามข้อกำหนดคุณสมบัติค่าส่วนหัวอยู่ใน ISO-8859-1 ฉันส่งอักขระที่มีความสูง 8859-1 ตัว (โดยเฉพาะเสียงสระที่เน้นเสียงบางอย่างที่ใช้เป็นภาษาฝรั่งเศส) ในส่วนหัวของ Tomcat และให้พวกเขาตีความอย่างถูกต้องโดย Firefox ดังนั้นในระดับหนึ่งงานนี้ในทางปฏิบัติเช่นเดียวกับในทางทฤษฎี (แม้ว่านี่จะเป็นส่วนหัว Location ซึ่งมี URL และอักขระเหล่านี้ไม่ถูกต้องใน URL ดังนั้นนี่จึงผิดกฎหมาย แต่ภายใต้กฎที่แตกต่างกัน!)
ที่กล่าวว่าฉันจะไม่พึ่งพา ISO-8859-1 ทำงานบนเซิร์ฟเวอร์พร็อกซีและลูกค้าทั้งหมดดังนั้นฉันจะติดกับ ASCII เป็นเรื่องของการเขียนโปรแกรมป้องกัน