2010-05-28 10 views

risposta

5

Windows ha scelto di supportare Unicode con UTF-16 e le funzioni Ascii/Unicode dell'ascendente way way way way way WAAAAAAY agli inizi degli anni 90 (Windows NT 3.1 è uscito nel 1993), prima che Linux avesse mai avuto la nozione di supporto Unicode.

Linux è stato in grado di apprendere dalle best practice basate su Windows e altre piattaforme compatibili Unicode.

Molte persone sono d'accordo oggi che UTF-8 è la migliore codifica per motivi di dimensioni, a meno che non si sappia che si tratterà di un sacco di caratteri a doppio byte - in esclusiva - dove UTF-16 è più efficiente in termini di spazio.

+1

Quindi, perché Java utilizza UTF-16? È un lavoro molto successivo. –

+0

Probabilmente per una migliore integrazione in Windows. Un tipico motivo "buono" (almeno, molto valido) per molte cattive decisioni di progettazione. – ypnos

+0

Penso che la compatibilità con Windows abbia molto a che fare con esso. (Python usa anche UTF-16 per stringhe unicode quando è in esecuzione su Windows.) Tuttavia c'è anche un semplice elemento di cattiva progettazione con Unicode in Java: ci sono molti posti in cui Java si rimette alla "codifica predefinita" di un sistema che è quasi mai la cosa giusta Java ti incoraggia a scrivere un codice charset fragile e non portatile. – bobince

11

UTF-16 è praticamente una perdita, il peggiore di entrambi i mondi. Non è né compatto (per il tipico caso di caratteri ASCII), né mappa ogni unità di codice in un carattere. Questo non ha davvero morso troppo nessuno, dato che i personaggi al di fuori del Basic Plilingual Plane sono ancora usati raramente, ma sicuramente è brutto.

POSIX (Linux et al) ha anche alcune API w, in base al tipo wchar_t. Su piattaforme diverse da Windows, in genere corrisponde a UTF-32 anziché UTF-16. Che è bello per una facile manipolazione delle stringhe, ma è incredibilmente gonfio.

Ma le API in-memory non sono poi così importanti. Ciò che causa molta più difficoltà è lo storage di file e protocolli on-the-wire, in cui i dati vengono scambiati tra applicazioni con tradizioni di charset differenti.

Qui, la compattezza batte la facilità di indicizzazione; UTF-8 è chiaramente dimostrato il miglior formato per questo di gran lunga, e il supporto scarso di Windows di UTF-8 causa reali difficoltà. Windows è l'ultimo sistema operativo moderno ad avere ancora codifiche predefinite specifiche della locale; tutti gli altri si sono spostati su UTF-8 per impostazione predefinita.

Anche se spero seriamente che Microsoft riconsideri questo per le versioni future, poiché causa problemi enormi e inutili anche all'interno del mondo di Windows, è comprensibile come sia successo.

Il pensiero ai vecchi tempi in cui veniva progettato WinNT era che UCS-2 era it per Unicode. Non ci sarebbe stato nulla al di fuori dell'intervallo di caratteri di 16 bit. Tutti userebbero UCS-2 in memoria e naturalmente sarebbe più semplice salvare questo contenuto direttamente dalla memoria. Questo è il motivo per cui Windows ha chiamato quel formato "Unicode", e fino ad oggi chiama UTF-16LE solo "Unicode" in UI come salva-scatole, nonostante sia totalmente fuorviante.

UTF-8 non è stato nemmeno standardizzato fino a Unicode 2.0 (insieme all'intervallo di caratteri esteso e ai surrogati che hanno reso UTF-16 quello che è oggi). A quel punto la Microsoft era arrivata a WinNT4, a quel punto era troppo tardi per cambiare strategia. In breve, Microsoft ha avuto la sfortuna di progettare un nuovo sistema operativo da zero nel periodo in cui Unicode era agli inizi.

+0

beh, Giappone e Cina usano le cose al di fuori del BMP abbastanza spesso ... – Spudd86

+1

Non direi spesso. Il BMP contiene gli ideogrammi che erano nel set di caratteri nazionali precedentemente standard (Shift-JIS, Big5, GB ecc.), Quindi i caratteri aggiuntivi nello SMP sono quelli che gli utenti CJK non potevano usare prima di Unicode 3.1 . Questi sono per lo più personaggi storici di interesse accademico, gli IME non ti permettono di digitarli direttamente, e il supporto dei font è ancora molto debole. – bobince

Problemi correlati