2012-02-06 10 views
22

domanda aggiornato ¹Quale versione di Unicode è supportata da quale piattaforma .NET e su quale versione di Windows si tratta di classi di caratteri?

Per quanto riguarda le classi di personaggi, il confronto, l'ordinamento, la normalizzazione e regole di confronto, quale versione Unicode o le versioni sono supportate dalle piattaforme che NET?

domanda originale

mi ricordo un po 'vagamente di aver letto che .NET supportato Unicode versione 3.0 e che la codifica UTF-16 interna non è realmente UTF-16, ma in realtà utilizza UCS-2, che non è il stesso. Sembra, per esempio, che i caratteri sopra U + FFFF non sono possibili, cioè considerare:

string s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

e memorizza la stringa "ᵽ9".

praticamente sto cercando riferimenti definitivi di risposte al seguente:

  • Se non è vero UTF-16 in .NET, che cos'è?
  • Quale versione di Unicode è supportata da .NET?
  • Se le versioni recenti non sono supportate o pianificate nel prossimo futuro, qualcuno conosce una libreria (non commerciale) o come posso risolvere questo problema?

¹) Ho aggiornato la questione con il tempo che passa, sembra più appropriato rispetto alle risposte e alla comunità più ampia. Ho lasciato la domanda originale al posto di quali parti hanno ricevuto risposta nei commenti. Anche il vecchio UCS-2 (nessun surrogato) è stato utilizzato nelle versioni Windows a 32 bit antiche, .NET ha sempre utilizzato internamente UTF-16 (con surrogati).

+1

Che cosa stai cercando di fare con quei personaggi? Inserirli in una pagina Web con ASP.NET? Visualizzarli in un'interfaccia WPF o WinForms? –

+2

Che cosa significa "non sembra funzionare" in questo contesto? – Gabe

+0

@JoeStrommen: stiamo implementando un nuovo set di strumenti per la trasformazione dei dati basati su XML e sto cercando di scoprire se posso dire "supportiamo Unicode fino a 6.0" o se dovremmo dire qualcos'altro. Inoltre, sto cercando di scoprire come evitare le limitazioni possibili in .NET. – Abel

risposta

16

Internamente, .NET è UTF-16. In alcuni casi, ad es. quando ASP.NET scrive su una risposta, per impostazione predefinita utilizza UTF-8. Entrambi possono gestire aerei più alti.

La ragione per le persone a volte si riferiscono a .NET come UCS2 è (io penso , perché vedo pochi altri motivi) che Char è rigorosamente a 16 bit e un singolo Char non può essere utilizzato per rappresentare i piani superiori. Tuttavia, Char ha sovraccarichi di metodo statici (ad esempio Char.IsLetter) che possono operare su caratteri UTF-16 di alto livello all'interno di una stringa. Le stringhe sono memorizzate come UTF-16 vero.

È possibile indirizzare codepoint elevati in Unicode direttamente utilizzando maiuscolo \U - ad es. "\U0001D7D9" - ma ancora, solo dentro stringhe, non caratteri.

Per quanto riguarda la versione Unicode, from the MSDN documentation:

"In .NET Framework 4, l'ordinamento, involucro, la normalizzazione, e le informazioni di carattere Unicode è sincronizzata con Windows 7 e si conforma al Unicode 5.1 standard di."

Update 1: Vale la pena notare, tuttavia, che questo non implica che la totalità di Unicode 5.1 è supportato - né in Windows 7 né in .NET 4.0

Windows 8 targets Unicode 6.0 - Sono supponendo che .NET Framework 4.5 possa sincronizzarsi con quello, ma non ha trovato fonti che lo confermino. E ancora una volta, ciò non significa che l'intero standard sia implementato.

Aggiornamento 2:This note on Roslyn conferma che la piattaforma sottostante definisce il supporto Unicode per il compilatore, e nel link to the code spiega che C# 6.0 supporta Unicode 6.0 e fino (con un cambiamento di rottura per C# identificatori come risultato).

Update 3: Poiché .NET versione 4.5 un new class SortVersion viene introdotto per ottenere la versione Unicode supportata chiamando la proprietà statica SortVersion.FullVersion. Su the same page, Microsoft spiega che .NET 4.0 supporta Unicode 5.0 su tutte le piattaforme e .NET 4.5 supporta Unicode 5.0 su Windows 7 e Unicode 6.0 su Windows 8. Questo leggermente contrappone the official "what is new" statement here, che parla rispettivamente della versione 5.xe 6.0. Dalla mia esperienza (editor: Abel), nella maggior parte dei casi sembra che in .NET 4.0, Unicode 5.1 sia supportato almeno per le classi di caratteri, ma non ho verificato l'ordinamento, la normalizzazione e le regole di confronto. Questo sembra in linea con quanto detto in MSDN come citato sopra.

+1

Buona osservazione su 'char'. Ho notato infatti che 'char uni =" \ U0002B740 ".ToCharArray() [0];' mostra "55405", che è solo la metà della coppia di surrogati UTF-16. Dal tuo riferimento risulta che provare Char.IsLetter su '\ u0526' (erroneamente) mostra' false', perché è stato introdotto solo con Unicode 6. – Abel

+1

(accettando questo perché hai mostrato il riferimento che stavo cercando e troppo stupido da trovare in posizione ovvia, tuttavia, le altre risposte sono preziose) – Abel

+1

Questo potrebbe essere un utile punto di origine per ottenere informazioni per singoli caratteri: [MSDN link] (http://msdn.microsoft.com/en- us/library/system.globalization.stringinfo.aspx). Poiché char non può contenere più della metà, i metodi StringInfo restituiscono invece una stringa, con la coppia UTF-16 completa (se il carattere * è * una coppia - altrimenti restituisce solo il carattere singolo - come stringa, o carattere + combinazione caratteri per combinare segni diacritici). – JimmiTh

4

MSDN copre brevemente qui: http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

ho provato questo:

static void Main(string[] args) { 
     string someText = char.ConvertFromUtf32(0x1D7D9); 
     using (var stream = new MemoryStream()) { 
      using (var writer = new StreamWriter(stream, Encoding.UTF32)) { 
       writer.Write(someText); 
       writer.Flush(); 
      } 
      var bytes = stream.ToArray(); 
      foreach (var oneByte in bytes) { 
       Console.WriteLine(oneByte.ToString("x")); 
      } 
     } 
    } 

e ottenuto un dump di un array di byte contenente una corretta distinta base e la corretta rappresentazione della \ u1D7D9 codepoint, per queste codifiche:

  • UTF8
  • UTF 32
  • Unicode (UTF-16)

Quindi la mia ipotesi è che i piani superiori sono supportati, e che UTF-16 è davvero UTF-16 (e non UCS-2)

+0

Grazie per aver mostrato un approccio facile. Sembra infatti essere UTF-16 e non UCS-2 (più?). Il carattere e tutte le sue codifiche sono qui: http://www.fileformat.info/info/unicode/char/1d7d9/index.htm – Abel

+0

Btw, ho letto quel riferimento ma non ho trovato informazioni definitive su quale versione è stata supportata da Unicode. – Abel

5

Quel personaggio è supportato.Una cosa da notare è che per i caratteri Unicode con più di 2 byte, è necessario dichiararli con una maiuscola '\ U', in questo modo:

string text = "\U0001D7D9"

Se si crea un'applicazione WPF con quel personaggio in un blocco di testo, dovrebbe rendere perfettamente il personaggio doppio.

+1

Un'altra cosa: leggi http://msdn.microsoft.com/en-us/library/aa664669(v=vs.71).aspx per una descrizione di come> i caratteri a 2 byte sono rappresentati in una stringa. –

0

.NET Framework 4.6 e 4.5 e 4 e 3.5 e 3.0 - Lo standard Unicode, versione 5.0 .NET Framework 2.0 e 1.1 - Lo standard Unicode, versione 3.1

Le risposte complete possono essere trovate here sotto la sezione Note.

+0

Vedere le modifiche apportate alla risposta originale, non è come ciò che la pagina MSDN sembra suggerire. Infatti, quella pagina parla solo delle categorie di caratteri Unicode, che non è la stessa in relazione alla codifica dei caratteri o agli intervalli di caratteri supportati, ma anche quelli sono diversi tra la versione del framework e il sistema operativo sottostante. Vedi per maggiori informazioni [articolo MSDN su SortVersion] (https://msdn.microsoft.com/en-us/library/system.globalization.sortversion%28v=vs.110%29.aspx) (ma attenzione, anche quella pagina non è completa). – Abel

Problemi correlati