2010-01-03 17 views
12

Ho una casella html con la quale gli utenti possono inserire del testo. Vorrei assicurarmi che tutto il testo inserito nella casella sia codificato in UTF-8 o convertito in UTF-8 quando l'utente termina la digitazione. Inoltre, non capisco come vengono scelte le varie codifiche UTF quando vengono inserite in una casella di testo.Come faccio a garantire che il testo codificato in un modulo sia utf8

In generale mi incuriosisce il seguente:

  • Come fa un browser determinare quale codifiche da utilizzare quando un utente sta scrivendo in una casella di testo?
  • In che modo javascript può determinare la codifica di un valore di stringa in una casella di testo html?
  • Posso forzare il browser a utilizzare solo la codifica UTF-8?
  • Come posso codificare codifiche arbitrarie in UTF-8. Presumo che ci sia una libreria JavaScript per questo?

** Modifica **

Rimosso alcune domande inutili ai miei obiettivi.

Questo tutorial mi ha aiutato a capire meglio i codici dei caratteri JavaScript, ma è bug e in realtà non traduce i codici carattere in utf-8 in tutti i casi. http://www.webtoolkit.info/javascript-base64.html

+0

Ecco un sacco di domande! Dobbiamo rispondere a tutti per pubblicare una risposta? –

+0

@Mark Byers non del tutto, sento che sono collegati al problema che sto cercando di risolvere. Le risposte alle prime 4 domande mi hanno avvicinato alla mia soluzione. –

risposta

15
  • Come fa un browser determinare quale codifiche da utilizzare quando un utente sta scrivendo in una casella di testo?

Utilizza la codifica la pagina è stata decodificata come impostazione predefinita. Secondo the spec, dovresti essere in grado di sovrascrivere questo con l'attributo accept-charset dell'elemento <form>, ma IE è buggato, quindi non dovresti fare affidamento su questo (ho visto diverse fonti diverse descrivono diversi bug e io non ho Ho tutte le versioni rilevanti di IE di fronte a me da testare, quindi lo lascerò a quello).

  • Come può javascript determinare la codifica di un valore stringa in una casella di testo HTML?

Tutte le stringhe in JavaScript sono codificati in UTF-16. Il browser map tutto in UTF-16 per JavaScript, e da UTF-16 in qualunque pagina è codificato in.

UTF-16 è una codifica che è cresciuto di UCS-2. Originariamente, si pensava che 65.536 punti di codice sarebbero stati sufficienti per tutti gli Unicode, e quindi una codifica di caratteri a 16 bit sarebbe stata sufficiente. Si è scoperto che non è il caso, e quindi il set di caratteri è stato esteso a 1,114,112 punti di codice. Per mantenere la compatibilità all'indietro, alcuni intervalli inutilizzati del set di caratteri a 16 bit sono stati messi da parte per le coppie surrogate, in cui sono state utilizzate due unità di codice a 16 bit per codificare un singolo carattere. Leggi su UTF-16 and UCS-2 on Wikipedia per i dettagli.

Il risultato è che quando si dispone di una stringa str in JavaScript, str.length non fornisce il numero di caratteri, fornisce il numero di unità di codice, in cui due unità di codice possono essere utilizzate per codificare un singolo carattere, se quel personaggio non è all'interno del piano multilingue di base.Ad esempio, "abc".length ti dà 3, ma "".length ti dà 6; e "".substring(0,1) fornisce quello che sembra una stringa vuota, dal momento che una mezza di una coppia surrogata non può essere visualizzata, ma la stringa contiene ancora quel carattere non valido (non garantisco che funzioni su browser incrociato, credo che sia accettabile rilasciare caratteri spezzati). Per ottenere un carattere valido, è necessario utilizzare "".substring(0,2).

  • Posso forzare il browser di utilizzare solo codifica UTF-8?

Il modo migliore per farlo è quello di consegnare la vostra pagina in UTF-8. Assicurati che il tuo server web invii le intestazioni appropriate Content-type: text/html; charset=UTF-8. È inoltre possibile incorporare un elemento <meta charset="UTF-8"> nell'elemento <head>, per i casi in cui lo Content-Type non viene impostato correttamente (ad esempio se la pagina viene caricata fuori dal disco locale).

  • Come posso codificare codifiche arbitrari a UTF-8 presumo v'è una libreria JavaScript per questo?

Non c'è molto bisogno in JavaScript per codificare il testo in particolare codifiche. Se stai semplicemente scrivendo sul DOM, o leggendo o compilando i controlli del modulo, dovresti usare solo le stringhe JavaScript che sono trattate come sequenze di unità di codice UTF-16. XMLHTTPRequest, se utilizzato a tramite POST, utilizzerà UTF-8 (se si passa un documento con una codifica diversa dichiarata nella dichiarazione <?xml ...>, può essere convertito o meno in UTF-8, quindi per compatibilità si dovrebbe generalmente non t usare qualcosa di diverso da UTF-8).

+0

+1, ottima risposta, grazie! –

+1

È ampiamente accettato che i browser Web pensano che ISO-8859-1 sia cp1252, e questo non è il motivo per cui 'accept-charset' è rotto. Quello che IE fa in realtà è considerare 'accept-charset' come solo un * set di caratteri di backup * da usare quando il set di caratteri preso dalla pagina stessa non può contenere il contenuto del campo del modulo. Ciò significa che quando viene inviato il modulo non è possibile sapere se IE ha utilizzato la codifica della pagina o la codifica 'accept-charset' per codificare un campo modulo (in realtà è probabile che vi sia una combinazione nel modulo). Questo rende impossibile recuperare i caratteri originali. – bobince

+0

OK, ho rimosso il riferimento a 'accept-charset'; dopo alcune ricerche, ho visto diverse fonti descrivono i bug in modo diverso, non ho tutte le versioni rilevanti di IE di fronte a me da testare, e non è necessario in ogni caso se si imposta la codifica dei caratteri su tutta la pagina su UTF -8. –

1

Il testo in una casella di testo non è codificato in alcun modo; è "testo", una serie astratta di personaggi. In quasi tutte le applicazioni contemporanee, quel testo è espresso come una sequenza di punti di codice Unicode, che sono interi mappati a particolari caratteri astratti. Il testo non viene "codificato" finché non viene trasformato in una sequenza di byte, come quando si invia il modulo. A quel tempo, la codifica è determinata dalla codifica della pagina HTML in cui viene visualizzato il modulo o dall'attributo accept-charset dell'elemento modulo.

+0

Che cosa succede se voglio convertire il valore di quel modulo nel suo equivalente esadecimale in forma di stringa? Quale codifica viene visualizzata da ECMAScript? –

+1

@ e5 Come ho detto nella mia risposta, le stringhe in JavaScript appaiono come sequenze di unità di codice UTF-16. Se si accede a una stringa di carattere per carattere, o si verifica la sua lunghezza, vedrete punti di codice surrogato se si dispone di caratteri oltre il BMP. –

+0

@Brian Campbell, Grazie per la rapida risposta. Quali sono i punti del codice surrogato? Qual è la relazione tra i valori esadecimali per un carattere utf-16 e i codici char forniti da javascript? –

4

desidero assicurare tutto il testo immesso nella casella è sia codificato in UTF-8

testo in HTML DOM compresi campi di inserimento senza codifica byte intrinseca; è memorizzato come caratteri Unicode (in particolare, a livello di standard DOM e ECMAScript, unità di codice UTF-16, nel raro caso in cui si usano caratteri al di fuori del Piano multilingue di base è possibile vedere la differenza, ad esempio ''.length è 2).

È solo quando viene inviato il modulo che il testo viene serializzato in byte utilizzando una particolare codifica, per impostazione predefinita la stessa codifica utilizzata per analizzare la pagina Quindi è necessario pubblicare la pagina contenente il modulo come UTF-8 (via Content-Type header charset parametro e/o tag equivalente <meta>).

Mentre in linea di principio è presente un override per questo nell'attributo accept-charset dell'elemento <form>, non funziona correttamente (ed è dannoso in molti casi) in IE. Quindi evitare quello.

Non ci sono funzioni di gestione della codifica esplicite disponibili in JavaScript. Puoi incidere un codificatore Unicode-UTF-8-bytes concatenando unescape(encodeURIComponent(str)) (e viceversa con la funzione inversa), ma questo è tutto.

+0

+1 per quella parola in grassetto. – BalusC

+0

Ho visto unescape (encodeURIComponent (str)) prima, ma temevo che non funzionasse in tutti i casi. –

+0

È solido, e praticamente l'unica cosa di escape/unescape dovrebbe mai essere usata (anche allora, è piuttosto raro che tu ne abbia mai bisogno). – bobince

Problemi correlati