2012-01-03 10 views
23

Ho letto in alcuni punti che le stringhe JavaScript sono UTF-16 e in altri posti sono UCS-2. Ho fatto qualche ricerca per cercare di capire la differenza e ho trovato questo:stringhe JavaScript - UTF-16 vs UCS-2?

D: Qual è la differenza tra UCS-2 e UTF-16?

A: UCS-2 è obsoleto terminologia che si riferisce ad un'implementazione Unicode fino a Unicode 1.1, prima code point surrogati e UTF-16 sono stati aggiunti alla versione 2.0 dello standard. Questo termine dovrebbe ora essere evitato.

UCS-2 non definisce un formato dati distinto, poiché UTF-16 e UCS-2 sono identici ai fini dello scambio di dati. Entrambi sono a 16 bit e hanno esattamente la stessa rappresentazione di codice.

volte in passato un'implementazione è stato etichettato "UCS-2" per indicano che non supporta i caratteri supplementari e non interpreta coppie di code point surrogati come caratteri. Tale implementazione non gestiva l'elaborazione delle proprietà dei caratteri, i limiti del punto di codice , le regole di confronto ecc. Per i caratteri supplementari.

via: http://www.unicode.org/faq/utf_bom.html#utf16-11

Quindi la mia domanda è, è perché i metodi e gli indici dell'oggetto stringa JavaScript agiscono sui valori di dati a 16 bit invece di personaggi ciò che rendono alcune persone considerano UCS-2? E in tal caso, un oggetto stringa JavaScript orientato attorno ai caratteri invece dei blocchi di dati a 16 bit può essere considerato UTF-16? O c'è qualcos'altro che mi manca?

Edit: Come richiesto, ecco alcune fonti dicono stringhe JavaScript sono UCS-2:

http://blog.mozilla.com/nnethercote/2011/07/01/faster-javascript-parsing/ http://terenceyim.wordpress.com/tag/ucs2/

EDIT: Per tutti coloro che possono venire attraverso questo, assicurati di controllare questo link:

http://mathiasbynens.be/notes/javascript-encoding

risposta

18

JavaScript, in senso stretto, ECMAScript, pre-data Unicode 2.0, quindi in alcuni casi è possibile trovare riferimenti a UCS-2 semplicemente perché era corretto al momento in cui è stato scritto il riferimento. Puoi indicarci le citazioni specifiche di JavaScript come "UCS-2"?

specifiche per le versioni ECMAScript 3 e 5, almeno due dichiarano esplicitamente una stringa da una collezione senza segno interi a 16 bit e che se quei valori interi hanno lo scopo di rappresentare i dati testuali, allora sono UTF-16-unità di codice .Vedere la sezione 8.4 di the ECMAScript Language Specification.


EDIT: non sono più sicuro che la mia risposta è del tutto corretto. Vedere l'eccellente articolo menzionato sopra, http://mathiasbynens.be/notes/javascript-encoding, che in pratica dice che mentre un motore JavaScript può utilizzare UTF-16 internamente, e la maggior parte lo fa, il linguaggio stesso espone efficacemente quei caratteri come se fossero UCS-2.

+0

Grazie per il link, la lingua delle specifiche sembra abbastanza chiara. Penso che il discorso di UCS-2 sia vecchio o basato sul metodo e sul supporto dell'indicizzazione per le coppie surrogate. – patorjk

+0

Quindi, la specifica indica "Ogni valore intero nella sequenza di solito rappresenta una singola unità a 16 bit di testo UTF-16. Tuttavia, ECMAScript non pone alcuna restrizione o requisito sui valori eccetto che devono essere numeri interi senza segno a 16 bit . ", che equivale a dire che nei moderni programmi C ogni valore di carattere in un array di caratteri" di solito "rappresenta una singola unità di 8 bit di testo UTF-8, ma ovviamente affermando che le stringhe C" sono "UTF-8 sarebbe sbagliato. La semantica JavaScript fornisce è solo UCS-2; se si desidera il supporto UTF-16, è necessario farlo da soli, come da risposta di DMoses. –

+0

UCS è la cosa con i numeri e sì UCS 2 è obsoleto, la versione corrente è UCS 4. UTF-8/-16/-32 sono modi per rappresentare gli array di oggetti UCS in bit. ;) – Philip

8

E 'UTF-16/USC-2. Può gestire coppie surrogate, ma lo charAt/charCodeAt restituisce un char a 16 bit e non il punto di codice Unicode. Se si desidera che gestisca le coppie sostitutive, suggerisco una lettura veloce tramite this.

+0

Cosa intendi per "può gestire le coppie surrogate"? – cubuspl42

+0

Se leggi l'articolo collegato descriverà come farlo gestire le coppie di surrogati. Il mio punto è che non commette errori di default, e ci sono modi per gestire le coppie surrogate come mostrato nel codice sul link fornito. –

+1

@ cubuspl42 UTF-16 non è limitato a 0x0-0xFFFF, può codificare coppie di caratteri a 16 bit e rappresentare l'intero intervallo Unicode da 0x0-0x101000, oltre un milione di codepoint. Queste coppie sono chiamate "coppie surrogate". – doug65536