Share via


Normalización y ordenación

Algunos caracteres Unicode tienen múltiples representaciones binarias equivalentes, que consisten en conjuntos de caracteres Unicode combinables o compuestos. Por consiguiente, dos cadenas pueden parecer idénticas pero realmente estar compuestas de caracteres diferentes. La existencia de varias representaciones para un carácter individual complica las operaciones de ordenación. La solución a este problema consiste en normalizar cada cadena y, a continuación, utilizar una comparación ordinal para ordenar las cadenas.

El estándar Unicode define un proceso denominado normalización, que devuelve una representación binaria de un carácter al proporcionar cualquiera de las representaciones binarias equivalentes de ese carácter. El estándar Unicode define cuatro algoritmos diferentes, llamados formas de normalización, que se pueden utilizar para normalizar una cadena. Cada forma de normalización obedece reglas diferentes y por consiguiente produce una representación binaria diferente de una cadena de entrada. Sin embargo, si dos cadenas se normalizan a la misma forma de normalización, las cadenas se pueden comparar posteriormente utilizando una comparación ordinal (sin distinguir entre mayúsculas y minúsculas).

Una comparación ordinal de dos cadenas es una comparación binaria del valor numérico, o punto de código, de cada par de estructuras Char correspondientes en los dos objetos String que representan las cadenas normalizadas. .NET Framework proporciona varios métodos que pueden realizar una comparación ordinal.

Su aplicación puede utilizar el siguiente proceso para normalizar y ordenar las cadenas:

  1. Obtenga dos cadenas que se van a ordenar desde un origen de entrada como un archivo o datos proporcionados por el usuario.

  2. Utilice el método String.Normalize() para normalizar ambas cadenas a la forma de normalización C, o el método String.Normalize(NormalizationForm) para normalizar ambas cadenas a la forma de normalización que prefiera.

  3. Utilice una comparación de cadenas ordinal, como el método Compare(String, Int32, String, Int32, Int32, StringComparison) con un valor Ordinal o OrdinalIgnoreCase, para comparar las dos cadenas. La operación de comparación determina si la primera cadena precede léxicamente a la segunda o si las dos cadenas son léxicamente iguales.

  4. Emita las cadenas en la salida ordenada basándose en los resultados del paso 3. Si las cadenas no son iguales, emita las cadenas en el orden que consiga un sentido ascendente o descendente.

    Si las cadenas son iguales, cada cadena se podrá emitir primero a no ser que sea adecuado organizar las cadenas en función de otra característica que no sea el orden léxico. Por ejemplo, si la aplicación está ordenando nombres de archivo pero también está escribiendo las propiedades de cada archivo en la salida, podría escribir nombres de archivo iguales en el orden de las fechas de creación de los archivos.

  5. Repita este proceso hasta que toda la entrada se haya ordenado.

Para obtener más información sobre la compatibilidad de formas de normalización en .NET Framework, vea la descripción de la enumeración NormalizationForm. Para obtener más información sobre la normalización de una cadena, vea el método Normalize.

Para obtener más información sobre la normalización, la descomposición de caracteres y la equivalencia, vea Unicode Standard Annex #15, "Unicode Normalization Forms", en la página principal de Unicode.

Vea también

Conceptos

Ordenar con referencias culturales

Comparar y ordenar datos para una referencia cultural específica

Otros recursos

Codificación y localización