“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 Wow, grazie per questa bella risposta. Sto digerendo Se potessi votare due volte vorrei :). –