2009-03-30 20 views
7

¿Es posible en C# usar caracteres UTF-32 que no están en el plano 0 como un carácter?C# y UTF-16 caracteres

string s = ""; // valid 
char c = ''; // generates a compiler error ("Too many characters in character literal") 

Y en s se representa con dos caracteres, no uno.

Editar: Quiero decir, ¿hay un tipo de caracteres AN con el soporte total de Unicode, UTF-32 o UTF-8 por carácter? Por ejemplo, si quiero un bucle for en utf-32 (tal vez no en plano0) caracteres en una cadena.

Respuesta

9

La clase string representa un bloque codificado UTF-16 de texto, y cada char en un string representa un valor de código UTF-16.

Aunque no hay ningún tipo BCL que representa un único punto de código Unicode, no hay soporte para caracteres Unicode más allá Plane 0 en forma de sobrecargas de método que toman un string y un índice en lugar de sólo un char. Por ejemplo, el método estático GetUnicodeCategory(char) en la clase System.Globalization.CharUnicodeInfo tiene un método correspondiente GetUnicodeCategory(string,int) que reconocerá un carácter simple o un par sustituto que comience en el índice especificado.


para iterar a través de los elementos de texto en un string, puede utilizar los métodos de la clase System.Globalization.StringInfo. Aquí, un "elemento de texto" corresponde a un solo carácter como se muestra en la pantalla. Esto significa que los caracteres simples ("a"), combinando caracteres ("a\u0304\u0308" = "a & # x0304; & # x0308;"), y los pares sustituidos ("\uD950\uDF21" = "& # xD950; & # xDF21;") serán tratados como un solo elemento de texto

Específicamente, el método estático GetTextElementEnumerator le permitirá enumerar cada elemento de texto en un string (consulte la página de MSDN vinculada para obtener un ejemplo de código).

+1

Buena presentación de los hechos. Tenga en cuenta que C# le permite usar '" \ U00064321 "' (exactamente ocho dígitos hexadecimales después del '\ U') que es equivalente a' "\ uD950 \ uDF21" 'pero más fácil de" entender "desde un Unicode/UTF-32 punto de vista. Este es un punto de código en [plano 6] (https://en.wikipedia.org/wiki/Plane_ (Unicode) #Unassigned_planes). –

4

Solo conozco este problema de Java y compruebo el documentation on char antes de responder y, de hecho, el comportamiento es muy similar en .NET/C# y Java.

Parece que, efectivamente, un char se define como de 16 bits y definitivamente no puede contener nada fuera de plano 0. Sólo String/string es capaz de manejar esos caracteres. En un array char se representará como two surrogate characters.

3

C# System.String compatible con UTF-32 bien, pero no puede iterar a través de la cadena como si fuera una matriz de System.Char o usar IEnumerable.

por ejemplo:

// iterating through a string NO UTF-32 SUPPORT 
for (int i = 0; i < sample.Length; ++i) 
{ 
    if (Char.IsDigit(sample[i])) 
    { 
     Console.WriteLine("IsDigit"); 
    } 
    else if (Char.IsLetter(sample[i])) 
    { 
     Console.WriteLine("IsLetter"); 
    } 
} 

// iterating through a string WITH UTF-32 SUPPORT 
for (int i = 0; i < sample.Length; ++i) 
{ 
    if (Char.IsDigit(sample, i)) 
    { 
     Console.WriteLine("IsDigit"); 
    } 
    else if (Char.IsLetter(sample, i)) 
    { 
     Console.WriteLine("IsLetter"); 
    } 

    if (Char.IsSurrogate(sample, i)) 
    { 
     ++i; 
    } 
} 

Nota la diferencia sutil en el Char.IsDigit y Char.IsLetter llama. Y ese String.Length es siempre el número de "caracteres" de 16 bits, no el número de "caracteres" en el sentido UTF-32.

Desactivado el tema, pero el soporte UTF-32 es completamente innecesario para una aplicación que maneje idiomas internacionales, a menos que tenga un caso comercial específico para un lenguaje histórico/técnico oscuro.

+0

Lo que estás hablando no es UTF-32, es solo UTF-16 que contiene caracteres suplementarios. En UTF-32, cada carácter se almacena como cuatro bytes. Las cadenas .NET siempre son UTF-16. –

+1

En lugar de "con soporte UTF-32", el ejemplo probablemente debería decir "con soporte de par sustituto" o "con soporte para caracteres reales, no solo fragmentos de 16 bits de I-hope-this-char-is-in-the -BMP ". – Triynko

Cuestiones relacionadas