Saltar al contenido

¿Cómo comparar caracteres Unicode que “se parecen”?

Ya no tienes que indagar más en internet ya que llegaste al sitio perfecto, poseemos la solución que deseas sin problema.

Solución:

Debido a que son símbolos realmente diferentes, incluso si se ven iguales, primero es la letra real y tiene carácter. code = 956 (0x3BC) y el segundo es el signo micro y tiene 181 (0xB5).

Referencias:

  • Carácter Unicode ‘LETRA MU MINÚSCULA GRIEGA’ (U+03BC)
  • Carácter Unicode ‘MICRO SIGNO’ (U+00B5)

Entonces, si desea compararlos y necesita que sean iguales, debe manejarlo manualmente o reemplazar un carácter con otro antes de la comparación. O usa el siguiente código:

public void Main()

    var s1 = "μ";
    var s2 = "µ";

    Console.WriteLine(s1.Equals(s2));  // false
    Console.WriteLine(RemoveDiacritics(s1).Equals(RemoveDiacritics(s2))); // true 


static string RemoveDiacritics(string text) 

    var normalizedString = text.Normalize(NormalizationForm.FormKC);
    var stringBuilder = new StringBuilder();

    foreach (var c in normalizedString)
    
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        
            stringBuilder.Append(c);
        
    

    return stringBuilder.ToString().Normalize(NormalizationForm.FormC);

y la demostración

En muchos casos, puede normalizar ambos caracteres Unicode a una determinada forma de normalización antes de compararlos, y deberían poder coincidir. Por supuesto, qué forma de normalización necesita usar depende de los caracteres mismos; solo porque ellos Mira iguales no significa necesariamente que representen al mismo personaje. También debe considerar si es apropiado para su caso de uso; consulte el comentario de Jukka K. Korpela.

Para esta situación particular, si consulta los enlaces en la respuesta de Tony, verá que la tabla para U+00B5 dice:

Descomposición LETRA GRIEGA MINÚSCULA MU (U+03BC)

Esto significa que U+00B5, el segundo carácter de la comparación original, puede descomponerse en U+03BC, el primer carácter.

Por lo tanto, normalizará los caracteres mediante la descomposición de compatibilidad total, con las formas de normalización KC o KD. Aquí hay un ejemplo rápido que escribí para demostrar:

using System;
using System.Text;

class Program

    static void Main(string[] args)
    
        char first = 'μ';
        char second = 'µ';

        // Technically you only need to normalize U+00B5 to obtain U+03BC, but
        // if you're unsure which character is which, you can safely normalize both
        string firstNormalized = first.ToString().Normalize(NormalizationForm.FormKD);
        string secondNormalized = second.ToString().Normalize(NormalizationForm.FormKD);

        Console.WriteLine(first.Equals(second));                     // False
        Console.WriteLine(firstNormalized.Equals(secondNormalized)); // True
    

Para obtener detalles sobre la normalización de Unicode y las diferentes formas de normalización, consulte System.Text.NormalizationForm y la especificación Unicode.

Ambos tienen diferentes códigos de caracteres: consulte esto para obtener más detalles.

Console.WriteLine((int)'μ');  //956
Console.WriteLine((int)'µ');  //181

Donde, el primero es:

Display     Friendly Code   Decimal Code    Hex Code    Description
====================================================================
μ           μ            μ          μ     Lowercase Mu
µ           µ         µ          µ      micro sign Mu

Imagen

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *