2012-10-27 13 views
13

For example, is it valid ajax request:Il parametro charset può essere utilizzato con il tipo di contenuto applicazione/json in http/1.1?

$.ajax({ 
    type: "POST", 
    url: "SomePage.aspx/GetSomeObjects", 
    contentType: "application/json; charset=utf-8", 
    ... 
}); 

È used as an example sometimes, o software can break without explicit charset.

The rfc 4627 for application/json media type dice che non accetta alcun parametro nella sezione 6:

The MIME media type for JSON text is application/json. 

Type name: application 

Subtype name: json 

Required parameters: n/a 

Optional parameters: n/a 

It can be interpreted that charset shouldn't be used with application/json.

E section 3 suggerisce che non è necessario specificare charset:

JSON text SHALL be encoded in Unicode. The default encoding is 
UTF-8. 

Since the first two characters of a JSON text will always be ASCII 
characters [RFC0020], it is possible to determine whether an octet 
stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking 
at the pattern of nulls in the first four octets. 

     00 00 00 xx UTF-32BE 
     00 xx 00 xx UTF-16BE 
     xx 00 00 00 UTF-32LE 
     xx 00 xx 00 UTF-16LE 
     xx xx xx xx UTF-8 

perché UTF-8,16,32 codifiche possono essere infered dal contenuto. Perché dice che UTF-8 è l'impostazione predefinita? Il modo di scegliere un'altra codifica dei caratteri non è specificato nel rfc e la codifica può essere trovata in modo deterministico in ogni caso. Oppure ci sono altre codifiche di caratteri (non UTF-8,16,32) che supportano Unicode?

Alcuni sostengono che charset can be used:

Non sono d'accordo con la vostra valutazione che deve essere eliminato. RFC 2046 afferma che "altri tipi di media di sottotipi di" testo "potrebbero scegliere di impiegare il parametro charset come definito qui", che indica che non esiste alcuna restrizione sulla presenza del parametro charset sui tipi di applicazione . Inoltre, RFC 2045 afferma che "le implementazioni MIME devono ignorare tutti i parametri i cui nomi non riconoscono ". Quindi, non è ragionevole supporre che ci sia alcun danno fatto dalla sua presenza.

Maggio software rfc-compatibile genera tipo di contenuto application/json con un parametro charset? Il software conforme a rfc dovrebbe accettare tali richieste?

risposta

6

La recente json rfc 7159 says:

Nota: Nessun parametro "charset" è definito per questa registrazione.
L'aggiunta di uno non ha alcun effetto sui destinatari conformi.

, ad esempio, charset deve essere ignorato dai destinatari conformi.

È coerente con rfc 2045: "Le implementazioni MIME devono ignorare tutti i parametri di cui non riconoscono i nomi." perché rfc 7159 specifica ancora: "Parametri richiesti: n/a; Parametri facoltativi: n/d" per tipo di applicazione/json mime media (nessun parametro).

Il testo json non è più limitato ad essere un oggetto o un array e lo old section 3 che calcola la codifica dei caratteri basata sui primi due caratteri è scomparso nel nuovo rfc. UTF-8, UTF-16 o UTF-32 sono consentiti ma non è possibile specificare la codifica (nessuna distinta base, UTF-8 è l'impostazione predefinita).

Il parametro charset può essere utilizzato con il tipo di contenuto applicazione/json in http/1.1?

Non c'è nulla di male se charset="utf-8" viene utilizzato - utf-8 è la codifica di default per il testo JSON, ma altri valori potrebbe essere fuorviante, perché il valore deve essere ignorato dai destinatari conformi. Può solo interrompere i client che analizzano erroneamente l'intestazione Content-Type, ad esempio by comparing it verbatim with "application/json" o i client che tentano di utilizzare una codifica diversa da utf-8 per decodificare il testo json.

Maggio software rfc-compatibile genera tipo di contenuto application/json con un parametro charset?

no. Nessun parametro definito per applicazione/json.

Il software conforme a rfc può accettare tali richieste?

sì, dovrebbe. Il valore di charset deve essere ignorato.


ECMA-404 (La JSON Data Interchange Format) definisce testo json in termini di punti di codice Unicode cioè, json stessa preveda alcun comportamento per quanto riguarda i dettagli di codifica.

ECMA-262 (Specifica linguaggio ECMAScript) definisce anche il formato JSON sopra String (tipo Unicode).

8

application/json non definisce un parametro charset, quindi non è corretto includerne uno. Quello che dice RFC 2046 è che i tipi di applicazioni in generale potrebbero avere un parametro charset, come application/xml. Ma JSON no.

+0

E la citazione da rfc 2045? L'invio di un set di caratteri appropriato deve essere sicuro. – jfs

+0

@ J.F.Sebastian: stai presumendo che l'implementazione di cui stai parlando attui tutti gli standard pertinenti esattamente alla lettera. Questa è una supposizione piuttosto grande. Di solito ciò che si vuole è "ciò che è (a) probabilmente non è sbagliato _e_ (b) meno probabile che crei problemi di interoperabilità con implementazioni che sono leggermente sbagliate?" –

+0

@Henning: no. Non lo presumo (puoi vedere esempi non confermanti nella mia domanda e in alcuni dei link in esso). E sono d'accordo su entrambi (a) e (b). Potete fornire un esempio non ipotetico in cui l'invio di set di caratteri appropriati interrompe un'implementazione leggermente errata? – jfs

0

Il software conforme a rfc accetta tali richieste?

Secondo la risposta di Julian Reschke, apparentemente no. Tuttavia, come hai fatto notare, lo incontrerai potenzialmente in natura e poi dovresti affrontarlo, se vuoi parlare con quegli host non rfc compatibili.

Per uno, se è presente un codice che gestisce Accept-Charset e la parte charset dei tipi di contenuto per i messaggi di testo nel framework HTTP, perché non utilizzarlo anche per JSON? Dal punto di vista della programmazione, è più semplice (nessuna regola speciale per JSON) e più generale.

Personalmente, direi andiamo Unicode (utilizzando il rilevamento della codifica che citi) per ogni bit di testo. Purtroppo, ci sono i dispositivi del client, ad es.Telefoni cellulari giapponesi, che non gestiscono Unicode, ma solo Shift_JIS. Sarebbero altrimenti felici consumatori JSON (e paganti i clienti). Allora, cosa hai intenzione di fare? Nel mio caso particolare, per avere questi client a bordo, ho reso il set di caratteri configurabile tramite i meccanismi HTTP standard.

Su una nota a margine, al momento si sta lavorando su HTTP 2.0, e se i ragazzi sperano di creare uno standard che sia rigidamente rispettato, dovranno scrivere test di accettazione. Ovviamente questo potrebbe anche significare escludere i precedenti clienti legacy se le regole non possono essere piegate occasionalmente.

E qual è il punto di essere conformi se nessun altro è se non voi? Mi chiedo se anche Opera sia conforme, o, se è per questo, se tutte le RFC implementate possano essere interpretate in modo inequivocabile in primo luogo. Io non la penso così, specialmente nel caso di quelli più grandi come HTTP.

Se questo suona come il bashing di HTTP, lasciatemi dire questo: HTTP è un grande standard con concetti che hanno rivoluzionato non solo Internet. Il modo, ad es. le risorse sono specificate (apolidia) o il modo in cui viene eseguita la memorizzazione nella cache, ha stabilito buoni schemi che sono stati inclusi nelle implementazioni di molte applicazioni. E HTTP 2 potrebbe riprendere da dove si era interrotto 1.1. Speriamo solo che SPDY non sarà adottata 1 a 1. Odio dirlo, ma in questo caso sembra che HTTP Speed ​​+ Mobility di Microsoft è per molti versi più HTTP -ey di quella di Google invadente (e nella misura unRESTy) SPDY.

+0

Citazione necessaria per i telefoni giapponesi che non gestiscono UTF-8 ma che hanno XHR per essere in grado per elaborare JSON (al contrario di es. JSON-P). – hsivonen

+0

@hsivonen Questa è stata una dichiarazione di un cliente che utilizza il nostro prodotto. Abbiamo dovuto modificare il nostro prodotto per questo motivo, ad es.il cliente ha dovuto pagare per questo, quindi presumo abbiano ragione. Purtroppo, non ho più dettagli come quale modello o sistema operativo ecc. –

Problemi correlati