Dans de nombreux cas, vous pouvez normaliser les deux caractères Unicode à une certaine forme de normalisation avant de les comparer, et ils devraient pouvoir correspondre. Bien entendu, la forme de normalisation que vous devez utiliser dépend des caractères eux-mêmes ; ce n'est pas parce qu'ils regardez de la même façon ne signifie pas nécessairement qu'ils représentent le même personnage. Vous devez également vous demander si cela est approprié pour votre cas d'utilisation - voir le commentaire de Jukka K. Korpela.
Pour cette situation particulière, si vous vous référez aux liens dans La réponse de Tony vous verrez que le tableau pour U+00B5 dit :
Décomposition <compat> PETIT LETTRE GREC MU (U+03BC)
Cela signifie que U+00B5, le deuxième caractère de votre comparaison originale, peut être décomposé en U+03BC, le premier caractère.
Vous normaliserez donc les caractères en utilisant la décomposition de la compatibilité totale, avec les formes de normalisation KC ou KD. Voici un exemple rapide que j'ai écrit pour démontrer :
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
}
}
Pour plus de détails sur la normalisation d'Unicode et les différentes formes de normalisation, voir System.Text.NormalizationForm
y la spécification Unicode .
165 votes
On dirait que tu as trouvé le mu de Schrödinger.
19 votes
Il s'agit de caractères différents - même s'ils se ressemblent, ils ont des codes de caractères différents.
0 votes
Avez-vous essayé d'utiliser String.Compare("", "", StringComparison.Ordinal) (ou OrdinalIgnoreCase) ? Je pose la question parce que si vous faites une comparaison directe (non ordinale), alors les caractères seront toujours développés, puisque la façon dont le caractère est développé peut varier, vous pouvez voir des résultats différents.
3 votes
Je peux visuellement faire la différence entre les deux personnages ; l'un est plus étroit.
98 votes
Bienvenue à Unicode.
0 votes
Oui, c'est un caractère différent. Comment puis-je surmonter ce problème ?
4 votes
@DJ Remplacer l'un par l'autre ?
0 votes
@user2864740 Merci c'est la seule solution que je peux essayer pour le moment. Mais il pourrait y avoir d'autres caractères similaires à celui-ci. Y a-t-il un moyen de les changer en même code et de les comparer ensuite ?
0 votes
David Venegoni : Je viens de tester Ordinal et Invariant ; ils sont toujours enregistrés comme différents. De plus, vous avez utilisé deux fois le même signe mu.
0 votes
@BoltClock'saUnicorn : LOL tu es génial
12 votes
Que voulez-vous obtenir ? que ces deux-là soient égaux alors même leur code de caractère est différent mais le même visage ?
2 votes
@Jade - oui, si possible.
0 votes
Oui ! c'est ça, attendez je vais poster l'échantillon.
30 votes
"Se ressembler" et "se ressembler" sont des concepts vagues. Signifient-ils l'identité des glyphes, ou simplement une étroite similitude ? Jusqu'à quel point ? Notez que deux caractères peuvent avoir des glyphes identiques dans une police, très similaires dans une autre, et très dissemblables dans une autre police encore. Ce qui compte, c'est pourquoi vous feriez une telle comparaison et dans quel contexte (et l'acceptabilité des faux positifs et des faux négatifs).
4 votes
J'ai comparé chaque pixel, et c'est pareil.
9 votes
Hm... Le C# ne voit pas assez clair.
0 votes
Je me demande si ces (symboles Unicode qui se ressemblent) ne pourraient pas conduire à une sorte d'attaque ...
6 votes
@Tanmoy - yep : fr.wikipedia.org/wiki/IDN_homograph_attack
0 votes
@ tout le monde discutant de savoir s'ils se ressemblent ou pas : Vous réalisez que ça dépend du type de police que votre navigateur ou éditeur de texte utilise, n'est-ce pas ? Il me semble que j'ai une des meilleures polices qui différencie les deux caractères (il y a un petit empattement sur le mu).
10 votes
@ta.speot.is Il semble à la mode en ce moment de blâmer Unicode pour ces conneries mais ce n'est ni la faute d'Unicode ni même spécifique à Unicode. Il s'agit plutôt d'une conséquence du fait que des lettres ayant des significations différentes ont des rendus similaires (ou, comme ici, identiques).
2 votes
@Smileek : En fait, le problème est que le C# hace voir assez net. Les deux mus sont différents.
2 votes
@Luaan, je croyais à dimension10 - il l'a comparé pixel par pixel . Je... vous savez... je crois aux humains...
0 votes
@Smileek C'est peut-être le cas, mais la vérité est que les pixels ne représentent pas le personnage, ils sont juste une projection sur un dispositif d'affichage, qui se rapproche du personnage. Et même la représentation visuelle dépend de la police - par exemple, dans le redoutable Comic Sans, les deux sont très différents (probablement parce qu'il manque l'un des deux à CS :D).
1 votes
Il n'est pas nécessaire que les polices rendent les deux caractères de manière identique. Il se peut que ce soit le cas sur votre ordinateur, mais ils peuvent avoir une apparence différente selon le jeu de polices de votre système, celle que votre navigateur choisit pour rendre chaque caractère, etc.