unidades una texto secuencia representa como codigo codificar caracteres c# .net utf-16 ucs2 astral-plane

c# - una - ¿Qué versión de Unicode es compatible con qué plataforma.NET y con qué versión de Windows en relación con las clases de caracteres?



codificar string a utf-8 c# (4)

Pregunta actualizada ¹

Con respecto a las clases de caracteres, comparación, clasificación, normalización y intercalaciones, ¿qué versiones o versiones de Unicode son compatibles con qué plataformas .NET?

Pregunta original

Recuerdo vagamente haber leído que .NET era compatible con Unicode versión 3.0 y que la codificación UTF-16 interna no es realmente UTF-16, pero en realidad usa UCS-2, que no es lo mismo. Parece, por ejemplo, que los caracteres por encima de U + FFFF no son posibles, es decir, considere:

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

y almacena la cadena "ᵽ9" .

Básicamente estoy buscando referencias definitivas de respuestas a las siguientes:

  • Si no es cierto UTF-16 en .NET, ¿qué es?
  • ¿Qué versión de Unicode es compatible con .NET?
  • Si las versiones recientes no son compatibles o no están planeadas en un futuro cercano, ¿alguien sabe de una biblioteca no comercial o cómo puedo solucionar este problema?

¹) Actualicé la pregunta ya que con el paso del tiempo, parece más apropiado con respecto a las respuestas y a la comunidad en general. Dejé la pregunta original en lugar de qué partes han sido respondidas en los comentarios. Además, el antiguo UCS-2 (sin sustitutos) se usó en versiones de Windows de 32 bits ahora antiguas, .NET siempre ha usado UTF-16 (con sustitutos) internamente.


.NET Framework 4.6 y 4.5 y 4 y 3.5 y 3.0 - El estándar de Unicode, versión 5.0 .NET Framework 2.0 y 1.1 - El estándar de Unicode, versión 3.1

Las respuestas completas se pueden encontrar here en la sección Comentarios.


Ese personaje es compatible. Una cosa a tener en cuenta es que para los caracteres Unicode con más de 2 bytes, debe declararlos con una ''/ U'' en mayúsculas, como esto:

string text = "/U0001D7D9"

Si creas una aplicación WPF con ese carácter en un bloque de texto, debería representar perfectamente el carácter doble.


Internamente, .NET es UTF-16. En algunos casos, por ejemplo, cuando ASP.NET escribe en una respuesta, utiliza de forma predeterminada UTF-8. Ambos pueden manejar planos superiores.

La razón por la que las personas a veces se refieren a .NET como UCS2 es ( creo , porque veo algunas otras razones) que Char es estrictamente de 16 bits y no se puede usar una sola Char para representar los planos superiores. Sin embargo, Char tiene sobrecargas de métodos estáticos (por ejemplo, Char.IsLetter ) que pueden operar en caracteres UTF-16 de plano alto dentro de una cadena. Las cadenas se almacenan como verdadero UTF-16.

Puede abordar puntos de código Unicode altos directamente usando mayúsculas /U - por ejemplo, "/U0001D7D9" - pero nuevamente, solo dentro de cadenas, no caracteres.

En cuanto a la versión Unicode, de la documentación de MSDN :

"En .NET Framework 4, la información de clasificación, encuadernación, normalización y caracteres de Unicode se sincroniza con Windows 7 y cumple con el estándar Unicode 5.1 ".

Actualización 1: vale la pena señalar, sin embargo, que esto no implica que se admita la totalidad de Unicode 5.1, ni en Windows 7 ni en .NET 4.0

Windows 8 apunta a Unicode 6.0 : supongo que .NET Framework 4.5 podría sincronizarse con eso, pero no se han encontrado fuentes que lo confirmen. Y una vez más, eso no significa que se implemente todo el estándar.

Actualización 2: esta nota en Roslyn confirma que la plataforma subyacente define el soporte Unicode para el compilador, y en el enlace al código explica que C # 6.0 es compatible con Unicode 6.0 y superior (con un cambio importante para los identificadores de C # como resultado).

Actualización 3: Desde la versión 4.5 de SortVersion se introduce una nueva clase SortVersion para obtener la versión compatible de Unicode llamando a la propiedad estática SortVersion.FullVersion . En la misma página , Microsoft explica que .NET 4.0 es compatible con Unicode 5.0 en todas las plataformas y .NET 4.5 es compatible con Unicode 5.0 en Windows 7 y Unicode 6.0 en Windows 8. Esto contrasta ligeramente la declaración oficial de "lo que es nuevo" aquí , que habla de versión 5.xy 6.0 respectivamente. Desde mi propia experiencia (editor: Abel), en la mayoría de los casos parece que en .NET 4.0, Unicode 5.1 es compatible al menos para las clases de caracteres, pero no probé la clasificación, la normalización y las intercalaciones. Esto parece en línea con lo que se dice en MSDN como se cita anteriormente.


MSDN lo cubre brevemente aquí: http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

Intenté esto:

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")); } } }

Y obtuvo un volcado de una matriz de bytes que contiene una lista de materiales correcta y la representación correcta del punto de código / u1D7D9 , para estas codificaciones:

  • UTF8
  • UTF32
  • Unicode (UTF-16)

Así que mi conjetura es que los planos superiores son compatibles, y que UTF-16 es realmente UTF-16 (y no UCS-2)