c# .net encoding stream

c# - ¿Qué significa ".NET Framework usa el estándar de codificación UTF-16 por defecto"?



encoding stream (5)

Mi guía de estudio (para el examen 70-536) dice esto dos veces en el capítulo de texto y codificación, que está justo después del capítulo IO.

Todos los ejemplos hasta ahora están relacionados con el acceso simple a archivos usando FileStream y StreamWriter.

También dice cosas como "Si no sabes qué codificación usar cuando crees un archivo, no especifiques uno y .NET usará UTF16" y "Especifica diferentes codificaciones usando sobrecargas de constructores de Stream".

No importa el hecho de que las sobrecargas reales estén en la clase StreamWriter, pero bueno, lo que sea.

Estoy mirando StreamWriter ahora mismo en el reflector y estoy seguro de que puedo ver que el valor predeterminado es UTF8NoBOM.

Pero nada de esto está listado en la errata. Es un libro viejo (revisó el error de ambas ediciones) así que si estuviera mal, habría pensado que alguien lo había captado ...

Me hace pensar que tal vez no lo entendí.

Entonces ... ¿alguna idea de qué está hablando? ¿Algún otro lugar donde haya un defecto?

Es solo que estoy totalmente confundido.


"UTF-16" es un término molesto, ya que tiene dos significados que se confunden fácilmente.

El primer significado es una serie de puntos de código de 16 bits. La mayoría de estos corresponden directamente al carácter Unicode del mismo número; Los caracteres que se encuentran fuera del plano multilingüe básico (U + 10000 hacia arriba) se almacenan como dos puntos de código de 16 bits, cada uno de los Surrogates .

Muchos idiomas usan UTF-16 en este sentido para propósitos de almacenamiento interno, incluso como un tipo de cadena nativa. Esta es la fuente habitual de frases como ".NET (o Java) utiliza UTF-16 como su codificación predeterminada". .NET está accediendo a los elementos de una cadena UTF-16 de 16 bits a la vez (es decir, en el nivel de implementación, como uint16).

Lo siguiente a considerar es la codificación de tal cadena UTF-16 en bytes lineales, para el almacenamiento en un archivo o flujo de red. Como siempre, cuando almacena números más grandes en bytes, hay dos codificaciones posibles: little-endian o big-endian. Así que puedes usar "UTF-16LE", la codificación little-endian de UTF-16 en bytes, o "UTF-16BE", la codificación big-endian.

("UTF-16LE" es el más comúnmente usado. Solo para agregar más confusión a las llamas, Windows le da el nombre de codificación ambiguo y altamente ambiguo "Unicode". En realidad, casi siempre es mejor usar UTF-8 para el almacenamiento de archivos y flujos de red que cualquiera de UTF-16LE / BE.)

Pero si no sabe si un grupo de bytes contiene "UTF-16LE" o "UTF-16BE", puede usar el truco de ver el primer punto de código para resolverlo. Este punto de código, la marca de orden de bytes (BOM), solo es válido cuando se lee en una dirección, por lo que no puede confundir una codificación con la otra.

Este enfoque, de no importar el orden de bytes que tiene pero usar una lista de materiales para señalarlo, generalmente se menciona bajo el nombre de codificación ... "UTF-16".

Entonces, cuando alguien dice "UTF-16", no puede saber si se refieren a una secuencia de puntos de código Unicode con acceso corto, o una secuencia de bytes en un orden no especificado que se decodificará a uno.

("UTF-32" tiene el mismo problema.)

Si no sabe qué codificación usar cuando cree un archivo, no especifique uno y .NET usará UTF16

Si esa es la cita directa real es una mentira. La construcción de un StreamWriter sin un argumento de codificación se especifica explícitamente para proporcionarle UTF-8.


Pruébalo. Escribe la cadena "abcd" a un archivo. Si usa UTF8, el archivo tendrá un tamaño de 4 bytes. Bajo UTF16, será de 8 bytes. (más quizás el BOM)


UTF16 es la codificación predeterminada que .NET usará para codificar cadenas en su programa (como variables de cadena).



Tuve este problema con la clase estática System.IO.File .

Quería escribir una cadena que contenía UTF-16 XML en el archivo.

Primero, utilicé

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

Pero debido a que escribió la cadena como UTF-8, IE no la abrió y mostró el error:

La página XML no se puede mostrar. No se puede ver la entrada XML usando una hoja de estilo. Corrija el error y luego haga clic en el botón Actualizar o vuelva a intentarlo más tarde.

El cambio de la codificación actual a la codificación especificada no es compatible. Error al procesar el archivo de recursos: /// C: / Documents and Setti ...

En gran parte gracias a este artículo, encontré que la solución era usar explícitamente el constructor StreamWriter :

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