visual una quitar primeros los longitud length extraer ejemplos caracteres cadena c# .net string unicode

una - substring c#



¿Qué devuelve la propiedad.NET String.Length? Longitud neutra sustituta o longitud de carácter completa (3)

Ambos lo considerarían falso. La segunda pregunta sería verdadera si usted preguntara sobre el conteo de puntos de código de Unicode, pero si preguntara sobre la "longitud". La longitud de la cuerda es la cuenta de sus elementos que son palabras. En caso de que solo haya puntos de código Unicode de BMP (Plano Multilingüe Básico) dentro de la cadena, la longitud es igual al número de caracteres / puntos de código Unicode. Si hay puntos de código más allá de BMP o sustitutos huérfanos (sustitutos altos o bajos que no aparecen como pares ordenados) la longitud NO es igual al número de caracteres / puntos de código.

En primer lugar, la cadena es un grupo de palabras, una lista de palabras, una matriz de palabras o un flujo de palabras. Su contenido son palabras de 16 bits y eso es todo. Nombrar un elemento "char" o "wchar" es un pecado relacionado con los caracteres Unicode. Debido a que un carácter Unicode puede tener un punto de código mayor que 0xFFFF, no se puede almacenar en un tipo de 16 bits de ancho y si este tipo se llama char o wchar es aún peor porque solo puede contener puntos de código limitados a 0xFFFF que concuerdan con el Unicode Norma 1.0 que hoy cumple 20 años. Para almacenar incluso el punto de código Unicode más alto posible en un solo tipo de datos, este tipo debería tener 21 bits, pero no existe tal tipo, por lo que usaríamos un tipo de 32 bits. De hecho, existe un método estático (¡de la clase char!) Que se llama ConvertToUtf32 () que hace esto, puede devolver un punto de código ASCII bajo o incluso el punto de código Unicode más alto, lo que implica que este método puede detectar un par suplente dentro de la posición de una cadena.

La documentación y el idioma varían entre VS 2008 y 2010:

Documentación VS 2008

Internamente, el texto se almacena como una colección de solo lectura de objetos Char, cada uno de los cuales representa un carácter Unicode codificado en UTF-16 . ... La longitud de una cadena representa el número de caracteres independientemente de si los caracteres se forman a partir de pares sustitutos de Unicode o no. Para acceder a los puntos de código Unicode individuales en una cadena, use el objeto StringInfo. - http://msdn.microsoft.com/en-us/library/ms228362%28v=vs.90%29.aspx

Documentación VS 2010

Internamente, el texto se almacena como una colección secuencial de solo lectura de objetos Char . ... La propiedad Longitud de una cadena representa el número de objetos Char que contiene, no el número de caracteres Unicode. Para acceder a los puntos de código Unicode individuales en una cadena, use el objeto StringInfo. - http://msdn.microsoft.com/en-us/library/ms228362%28v=VS.100%29.aspx

El lenguaje utilizado en ambos casos no distingue claramente entre "carácter", "carácter Unicode", "clase Char", "par suplente de Unicode" y "punto de código Unicode".

El lenguaje en la documentación de VS2008 que indica que una "cadena representa el número de caracteres independientemente de si los caracteres se forman a partir de pares sustitutos de Unicode" parece estar definiendo "carácter" como un objeto que puede ser el resultado de un par suplente de Unicode , lo que sugiere que puede representar una secuencia de 4 bytes en lugar de una secuencia de 2 bytes. También indica específicamente al principio que un objeto "char" está codificado en UTF-16, lo que sugiere que podría representar un par suplente (siendo 4 bytes en lugar de 2). Aunque estoy bastante seguro de que eso está mal.

La documentación del VS2010 es un poco más precisa. Hace una distinción entre "char" y "carácter Unicode", pero no entre "carácter Unicode" y "punto de código Unicode". Si un punto de código se refiere a la mitad de un par suplente, y un "carácter Unicode" representa un par completo, entonces la clase "Char" recibe un nombre incorrecto y no se refiere en absoluto a un "carácter Unicode" (lo cual indican que sí lo hace). no), y es realmente un punto de código Unicode.

Entonces, ¿son ciertas las siguientes afirmaciones verdaderas? (Si, yo pienso.)

  1. String.Length representa la longitud del punto de código Unicode, y
  2. String.Length no representa la longitud del carácter Unicode ni lo que consideraríamos como una longitud verdadera del carácter (número de caracteres que se mostraría), sino el número de objetos "Char", cada uno de los cuales representa un punto de código Unicode (no un Carácter Unicode).

String.Length no tiene en cuenta los pares sustitutos, solo cuenta los caracteres UTF-16 (es decir, los caracteres siempre son de 2 bytes): los pares sustitutos se cuentan como 2 caracteres.


String.Length no tiene en cuenta los pares sustitutos; sin embargo, el método StringInfo.LengthInTextElements hace.

StringInfo.SubstringByTextElements es similar a String.Substring, pero funciona en "Elementos de texto", como pares sustitutos y caracteres combinados, así como caracteres normales. La funcionalidad de ambos métodos se basa en el método StringInfo.ParseCombiningCharacters, que extrae el índice de inicio de cada elemento de texto y los almacena en una matriz privada.

".NET Framework define un elemento de texto como una unidad de texto que se muestra como un solo carácter, es decir, un grafema. Un elemento de texto puede ser un carácter base, un par suplente o una secuencia de caracteres combinada". - http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx