Per quanto ne so, Linux ha scelto la retrocompatibilità di UTF-8, mentre Windows ha aggiunto funzioni API completamente nuove per UTF-16 (che termina con "W"). Queste decisioni potrebbero essere diverse? Quale si è rivelato migliore?Perché i creatori di sistemi Windows e Linux hanno scelto diversi modi per supportare Unicode?
risposta
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.
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.
beh, Giappone e Cina usano le cose al di fuori del BMP abbastanza spesso ... – Spudd86
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
- 1. Come rilevare correttamente i sistemi operativi Windows, Linux e Mac
- 2. R su diversi sistemi operativi
- 3. AngularJS - diversi modi per creare controller e servizi, perché?
- 4. Macro di compilazione C++ per rilevare i sistemi operativi Windows
- 5. Quando supportare Windows 64?
- 6. Devo supportare Unicode nelle password?
- 7. Diversi modi di usare __init__ per PyQt4
- 8. Modi diversi per creare HashMaps
- 9. Perché i nomi delle funzioni delle librerie standard sono diversi tra Windows e Linux?
- 10. Costruzione identica su diversi sistemi
- 11. I lambda hanno tipi diversi?
- 12. diversi modi di ottenere l'EntityManager
- 13. Perché i numeri di chiamata di sistema sono diversi in amd64 linux?
- 14. L'orientamento dell'oggetto è negativo per i sistemi incorporati e perché?
- 15. UNICODE, UTF-8 e Windows p.
- 16. Perché i metodi C# System.Char per i test delle proprietà Unicode hanno due overload?
- 17. Perché questi due float64 hanno valori diversi?
- 18. Perché DecimalFormat ". #" E "0. #" hanno risultati diversi su 23.0?
- 19. Diversi modi di usare SelectMany()
- 20. Diversi modi per implementare i DAG in java
- 21. Quali sono i diversi modi per sostituire un cursore?
- 22. I caratteri arabi hanno diversi punti di codice Unicode in base alla posizione nella stringa?
- 23. Django con Gunicorn diversi modi per distribuire
- 24. diversi modi per accedere elemento dell'array
- 25. TextView diversi modi per aggiungere drawable
- 26. Diversi modi per scrivere Singleton in Java
- 27. Diversi modi per ottenere l'orientamento dell'interfaccia corrente?
- 28. Diversi modi per inizializzare una variabile
- 29. Diversi modi per aggiungere funzioni all'oggetto Javascript
- 30. Diversi modi per ottenere il servlet Contesto
Quindi, perché Java utilizza UTF-16? È un lavoro molto successivo. –
Probabilmente per una migliore integrazione in Windows. Un tipico motivo "buono" (almeno, molto valido) per molte cattive decisioni di progettazione. – ypnos
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