2009-03-23 9 views
16

La mia guida di studio (per l'esame 70-536) lo dice due volte nel capitolo di testo e codifica, subito dopo il capitolo IO.Cosa significa "Il framework .NET utilizza lo standard di codifica UTF-16 per impostazione predefinita" significa?

Tutti gli esempi finora hanno a che fare con un semplice accesso ai file utilizzando FileStream e StreamWriter.

Dice anche cose come "Se non si conosce la codifica da utilizzare quando si crea un file, non specificarne uno e .NET utilizzerà UTF16" e "Specificare codifiche diverse utilizzando gli overload di overload del costruttore".

Non importa il fatto che i sovraccarichi effettivi si trovano nella classe StreamWriter ma hey, qualunque sia.

Sto guardando StreamWriter proprio ora in reflector e sono certo che posso vedere che il valore predefinito è actaully UTF8NoBOM.

Ma nessuno di questi è elencato nell'errata. È un vecchio libro (che ha fatto l'errore di entrambe le edizioni) quindi se fosse sbagliato avrei pensato che qualcuno l'avesse raccolto ...

Mi fa pensare che forse non l'ho capito.

Quindi ..... qualche idea di cosa sta parlando? Qualche altro posto dove c'è un valore predefinito?

Mi ha completamente confuso.

risposta

35

“UTF-16” è un termine fastidioso, in quanto ha due significati che sono facilmente confusi.

Il primo significato è una serie di codepoint di 16 bit. La maggior parte di questi corrisponde direttamente al carattere Unicode dello stesso numero; i caratteri al di fuori del piano multilingue di base (U + 10000 verso l'alto) vengono memorizzati come due codepoint di 16 bit, ciascuno dei Surrogates.

Molte lingue utilizzano UTF-16 in questo senso per scopi di archiviazione interna, incluso come tipo di stringa nativo. Questa è la solita fonte di frasi come ".NET (o Java) usa UTF-16 come codifica predefinita". .NET sta accedendo agli elementi di una stringa UTF-16 di 16 bit alla volta (cioè, a livello di implementazione, come uint16).

La prossima cosa da considerare è la codifica di tale stringa UTF-16 in byte lineari, per l'archiviazione in un file o in un flusso di rete. Come sempre quando si memorizzano numeri più grandi in byte, ci sono due possibili codifiche: little-endian o big-endian. Quindi puoi usare "UTF-16LE", la codifica little-endian di UTF-16 in byte, o "UTF-16BE", la codifica big-endian.

("UTF-16LE" è il più utilizzato. Giusto per aggiungere più confusione alle fiamme, Windows fornisce il nome di codifica "Unicode" profondamente fuorviante e ambiguo. In realtà è quasi sempre meglio utilizzare UTF- 8 per archiviazione file e flussi di rete rispetto a UTF-16LE/BE.)

Ma se non si sa se un gruppo di byte contiene "UTF-16LE" o "UTF-16BE", è possibile utilizzare il trucco di guardare il primo punto di codice per risolverlo.Questo punto di codice, il Byte Order Mark (BOM), è valido solo se letto a senso unico, quindi non è possibile scambiare una codifica per l'altro.

Questo approccio, di non preoccuparsi di quale ordine di byte si ha ma utilizzando una distinta materiali per segnalarlo, viene solitamente indicato con il nome di codifica ... "UTF-16".

Quindi, quando qualcuno dice "UTF-16", non è possibile stabilire se significano una sequenza di punti di codice Unicode short-int o una sequenza di byte in ordine non specificato che decodificherà a uno.

(“UTF-32” ha lo stesso problema.)

If you don't know what encoding to use when you create a file, don't specify one and .NET will use UTF16

Se questo è la citazione diretta reale è una bugia. Costruire uno StreamWriter senza un argomento di codifica is explicitly specified per fornirti UTF-8.

+1

+1 Wow, grazie per questa bella risposta. Sto digerendo Se potessi votare due volte vorrei :). –

2

UTF16 è la codifica predefinita che .NET utilizzerà per codificare stringhe nel programma (come variabili stringa).

3

Testarlo. Scrivi la stringa "abcd" in un file. Se utilizza UTF8, il file avrà una dimensione di 4 byte. Sotto UTF16, saranno 8 byte. (Più forse il BOM)

+0

L'ho provato quando si utilizza uno Strea mWriter rompendo e controllando la codifica di StreamWriter - era UTF8NoBOM. Poiché tutti gli esempi sono stati eseguiti in questo modo e il libro non è stato elaborato, non ho ottenuto ciò su cui si trovano .... –

+0

È necessario specificare la codifica utilizzata da StreamWriter. –

2

Ho riscontrato questo problema con la classe statica System.IO.File.

Volevo scrivere una stringa contenente XML UTF-16 in un file.

In primo luogo, ho usato

using(StreamWriter writer = File.CreateText(xmlFilePathTarget)) 
{ 
    writer.Write(xmlString); 
} 

Ma perché ha scritto la stringa come UTF-8, IE non si apriva e visualizzato l'errore:

The XML page cannot be displayed Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.


Switch from current encoding to specified encoding not supported. Error processing resource 'file:///C:/Documents and Setti...

Grazie soprattutto a questo articolo, ho la soluzione è stata utilizzare esplicitamente il costruttore StreamWriter:

StreamWriter writer = new StreamWriter(xmlFilePathTarget, false, Encoding.Unicode));