Bir HTTP başlığı için hangi karakter kodlamasını kullanmalıyım?


122

Bir HTTP başlığı için "eğlenceli" bir HTML özel karakteri (✰) kullanıyorum ( daha fazla bilgi için http://html5boilerplate.com/ adresine bakın ) Serverve spesifikasyon başına "izin verilip verilmediğini" merak ediyorum.

  • Windows Xp Pro SP 3'te Chrome'daki geliştirme araçlarındaki Ağ Sekmesini kullanarak ✰ gayet iyi görüyorum.

  • IE8 ✰ edilir değil düzgün hale.

  • W3.org HTML doğrulayıcı yok değil doğru (görüntüler "render â°yerine").

Şimdi, karakter kodlamalarına pek meraklı değilim ... ve açıkçası onları pek umursamıyorum; UTF-8 cus'u körü körüne kullanmam söylendi. :-)


Farklı ayrıştırıcılarda / tarayıcılarda / motorlarda / (her ne denirse) hataların neden olduğu eşitsizlik mi?

Bunun için bir spesifikasyon var mı, yoksa bir HTTP başlığı "değeri" için izin verilen karakterlerin bir listesi var mı?


29
Bu soru genel olarak çok daha iyi sorulacaktır: "Bir http başlık değerinde hangi karakterlere izin verilir"
Akrikos


2
"Şimdi, karakter kodlamalarına pek meraklı değilim ... ve açıkçası onları pek umursamıyorum; sadece körü körüne UTF-8 kullanıyorum cus kullanmam söylendi. :-)" <--- - joelonsoftware.com/2003/10/08/… için zorunlu bağlantı
d4nyll

Yanıtlar:


124

Kısaca: Yalnızca ASCII'nin çalışması garantilidir. Geriye dönük uyumluluk için bazı ASCII olmayan baytlara izin verilir, ancak görüntülenebilir olmaları beklenmez.

HTTPbis pes etti ve başlıklarda ASCII dışında kullanışlı bir kodlama olmadığını belirtti:

Geçmişte HTTP, ISO-8859-1 karakter setinde [ISO-8859-1] metin içeren alan içeriğine izin vermiş, diğer karakter setlerini yalnızca [RFC2047] kodlamasıyla desteklemiştir. Pratikte, çoğu HTTP üstbilgi alanı değeri yalnızca US-ASCII karakter kümesinin [USASCII] bir alt kümesini kullanır. Yeni tanımlanmış başlık alanları, alan değerlerini US-ASCII sekizli ile sınırlandırmalıdır. Bir alıcı, alan içeriğindeki (obs-text) diğer sekizlileri opak veri olarak ele almalıdır.


Daha önce, 1999'daki RFC 2616 bunu tanımladı:

* METİN kelimeleri, yalnızca RFC 2047 [14] kurallarına göre kodlandığında, ISO-8859-1 [22] dışındaki karakter kümelerinden karakterler içerebilir.

ve RFC 2047, MIME kodlamasıdır , dolayısıyla şöyle olur:

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

ancak (varsa) pek çok müşterinin bunu desteklediğini düşünmüyorum.


7
Peki bunun anlamı nedir? "✰" geçerli mi / izin veriliyor mu?
David Murdoch

8
Çok yararlı bir cevabın bir bitini genişletmek için: "UTF-8" karakter kümesidir ve "Q", değerin "tırnakla yazdırılabilir" olacağı anlamına gelir. Değeri BASE64 olarak kodlamak isterseniz "B" de kullanılabilir.
GargantuChet

1
@porneL, "opak veri" ne anlama geliyor? Ne tam olarak HTTP alıcı olmalıdır yapmak bu "opak veriler" aldığında?
Pacerier

1
@Pacerier "opak veri", uygulamaların göstermeye veya yorumlamaya çalışmaması gereken (ikili veriler gibi) bir grup bayt içeren bir kara kutu anlamına gelir. Bununla ne olacağı başlığa bağlıdır, "hiçbir şey" ile "iptal" arasında değişebilir.
Kornel

@Kornel, Btw kullanıcı adınızı neden kornel olarak değiştirdiniz?
Pacerier

10

Lütfen önce yorumları okuyun, bu cevap muhtemelen doğru kaynaklardan yanlış sonuçlar çıkarır, düzeltilmesi gerekir.


Yazdırılabilir herhangi bir ASCII karakterini kullanabilirsiniz ve ✰ gibi özel karakterler kullanamazsınız ( ASCII değildir )

İpucu : JSON'daki her şeyi kodlayabilirsiniz.

Düzenleme : ilk bakışta açık olmayabilir, başlıkta tanımlanan karakter kodlaması, başlığın kendisi için değil, yalnızca yanıt gövdesi için geçerlidir. (Tavuk ve yumurta sorununa neden olacağı için.)


Tüm ilgili tanımları Penchant tarafından bağlanan spesifikasyona göre özetlemek istiyorum.

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

Yani, alan değerinin peşindeyiz .

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, Doğrusal Beyaz Boşluk anlamına gelir. Esasen, LWS Boşluk veya Sekmedir, ancak alan değerinizi bir Boşluk veya Sekmeden önce yeni bir satır başlatarak birden çok satıra bölebilirsiniz.

Bunu şu şekilde basitleştirelim:

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

Şimdi tarla içeriğinin peşindeyiz .

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

METİN en genel olanıdır ve geri kalan her şeyi içerir - yani gerisini unutun-. US-ASCII karakter kümesi (= ASCII)

Gördüğünüz gibi, yazdırılabilir tüm ASCII karakterlerine izin verilmektedir.


3
Sen edilir çelişen sen alıntı pasajlar. Neden "ve ✰ gibi özel karakterler yok" diyorsun? Özel karakterler yalnızca OCTETs'dir ve dışında TEXTherhangi biri olduğundan , bu, ' den' ye tüm karakterlere izin verildiği anlamına gelir . ✰ sekizli are , ve üçüne de izin verilir, bu nedenle alıntı yaptığınız pasajlara göre ✰'ye izin verilir. OCTET0 - 31OCTET32255 226156176
Pacerier

2
@Pacerier tamamen haklı görünüyorsun, neden yaptığım sonucu çıkardığımı anlamıyorum.
zupa

@Pacerier henüz teknik özellikleri tekrar kontrol etmem gerektiği için düzenlemeye hazır değilim. Korkarım ek ayrıntılar US-ASCII karakter setiyle sınırlanıyor ve bu da sonucu destekleyecek ancak muhakemeyi yetersiz kılacak.
zupa

1
"JSON'da her şeyi kodlayabilirsiniz" demek biraz yanıltıcıdır. JSON, Unicode karakterlere izin verirken, HTTP üstbilgileri US-ASCII olmalıdır. Unicode karakterleri "opak" veri olarak değerlendirilir ve bu nedenle davranış, HTTP belirtimine göre tanımsızdır. Bununla birlikte JSON, \ uXXXX kaçış dizisi aracılığıyla Unicode karakterlerinden çıkış yapılarak bir HTTP başlığına dahil edilmek üzere güvenli hale getirilebilir.
Jacob

@zupa, Bir diğer konu ise ... " hariçCTLs " ne anlama geliyor? O karakterleri anlamına mı CR, LFizin veriliyor? Yoksa sadece sürekli " CR LF SP/ HT" dizisine izin verildiği anlamına mı geliyor? (Diğer bir deyişle, değerleri tek ihtiva başlık edebilir CRya LFya HT? Can başlık değerleri karakterler içeren CR, LFve HT? Herhangi bir sırada ve miktarda)
Pacerier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.