2013-05-25 21 views
8

Przez lata od czytania zmieniających się specyfikacji założyłem, że ostatecznie RFC 3986 ustaliło kodowanie UTF-8 dla sekwencji oktetu ucieczki. Oznacza to, że jeśli mój identyfikator URI ma %XX%YY%ZZ, mogę wziąć tę sekwencję zdekodowanych oktetów (dla dowolnego URI w części specyficznej dla schematu) i zinterpretować wynikowe bajty jako UTF-8, aby dowiedzieć się, jakie zamierzone były odkodowane informacje. W praktyce mogę nazwać JavaScript decodeURIComponent(), który automatycznie wykonuje to dekodowanie.Charset w danych URI

Następnie czytałem specyfikację dla data: identyfikatorów URI, RFC 2397, który zawiera argument charset, który (oczywiście) wskazuje zestaw znaków zakodowanych danych. Ale jak to działa? Jeśli mam kodowaną w dwóch oktetach sekwencję %XX%YY w moim identyfikatorze URI data:, to czy charset=iso-8859-1 wskazuje, że dwa dekodowane liczby ósemkowe powinny być interpretowane jako sekwencja UTF-8, ale jako dwa oddzielne znaki łacińskie (jak każdy bajt w ISO). -8859-1 reprezentuje postać)? RFC 2397 wydaje się wskazywać, jak to pokazuje przykład „greckiego [sic!] Znaków”:

data:text/plain;charset=iso-8859-7,%be%fg%be 

Oznacza to jednak, że JavaScript decodeURIComponent() (co zakłada UTF-8 oktetów) nie mogą być stosowane do wyodrębniania ciąg znaków z identyfikatora URI danych, poprawny? Czy to oznacza, że ​​muszę utworzyć własne dekodowanie dla identyfikatorów URI danych, jeśli zestaw znaków jest czymś poza UTF-8?

Co więcej, czy oznacza to, że RFC 2397 jest teraz w konflikcie z RFC 3986, co wydaje się wskazywać, że przyjęto kodowanie UTF-8? Czy też RFC 3986 odwołuje się tylko do "nowego schematu URI [s]", co oznacza, że ​​schemat URI data: zostaje wtopiony i ma własną technikę określania znaczenia zakodowanych oktetów?

Moim zdaniem w tej chwili domyślam się, że data: odtwarza według własnych reguł i jeśli wskazuje na zestaw znaków inny niż UTF-8, będę musiał użyć czegoś innego niż decodeURIComponent() w JavaScript. Wszelkie zalecenia dotyczące metody zastępowania również byłyby mile widziane.

Odpowiedz

5

Pamiętaj, że program data: URI opisuje zasoby, które mogą być traktowane jako plik, który składa się z nieprzezroczystej bytestream tak jakby to była http: URI (ten sam bytestream, ale przechowywane na serwerze HTTP) lub ftp: URI (ten sam bytestream, ale przechowywany na serwerze FTP) lub URI file: (ten sam bytestream, ale przechowywany w lokalnym systemie plików). Tylko metadane dołączone do pliku dają znaczenie bytestream.

RFC 2397 podaje jasną specyfikację tego, w jaki sposób ten bytream ma być osadzony w samym identyfikatorze URI (w przeciwieństwie do innych schematów URI, w których URI podaje instrukcje, gdzie pobrać bajt strumienia, a nie co zawiera). Może to być base64 lub może to być metoda kodowania procentowego podana w specyfikacji RFC. Base64 będzie bardziej kompaktowy, jeśli bajt strumienia zawiera bajty inne niż ASCII.

Identyfikator URI data: opisuje również własny typ zawartości, który zapewnia zamierzoną interpretację bytestream. W tym przypadku, ponieważ użyłeś text/plain;charset=iso-8859-7, bajty muszą być poprawnie zakodowane w tekście ISO-8859-7. Bajty na pewno będą oznaczone jako UTF-8 lub jakiekolwiek inne kodowanie znaków. Zostanie jednoznacznie zdekodowany za pomocą kodowania znaków, które określiłeś.

Powiązane problemy