2015-01-15 22 views
5

Perché con .net (Windows 8) questo confronto di stringhe restituisce true?Perché la stringa " u0022" inizia con questa stringa " u204D"

"\u0022".StartsWith("\u204D"); 

E 'vero in tutte le culture e se si passa lo StartsWith a un Equals restituisce false.

Esistono molti caratteri diversi che restituiscono true per un confronto StartsWith. Questa parte di una strana regola Unicode o Windows ha le sue regole qui?

+0

Cercare il nome del carattere proprio di un unicode tavolo. I confronti Unicode sono sottili. Ad esempio alcuni caratteri (ad esempio un joiner a larghezza zero (non) o determinati modificatori) vengono ignorati nei confronti della cupola. – CodesInChaos

+0

Se si desiderano regole semplici, utilizzare confronti ordinali. – CodesInChaos

+0

@CodesInChaos Vuoi passare a Ordinal e sto correndo attraverso i possibili cambiamenti che si verificano quando questo e molti altri sono venuti fuori. – Zoom

risposta

0

Non è facile sapere quali regole si trovano nell'ambito dei confronti di stringhe dipendenti dalla cultura. Sembrerebbe abbastanza coerente che le punteggiature U + 0022 " (QUOTATION MARK) e U + 204D (BLACK RIGHTWARDS BULLET) siano considerate "uguali a sufficienza" in confronti di culture (comprese quelle della cultura invariabile). Questi esempi indicano che tutti:

// culture-sensitive: 

Console.WriteLine("\"".StartsWith("⁍")); 
Console.WriteLine("⁍".StartsWith("\"")); 
Console.WriteLine("\"".StartsWith("⁍", StringComparison.InvariantCulture)); 
Console.WriteLine("⁍".StartsWith("\"", StringComparison.InvariantCulture)); 

Console.WriteLine("\"".Equals("⁍", StringComparison.CurrentCulture)); 
Console.WriteLine("⁍".Equals("\"", StringComparison.CurrentCulture)); 
Console.WriteLine("\"".Equals("⁍", StringComparison.InvariantCulture)); 
Console.WriteLine("⁍".Equals("\"", StringComparison.InvariantCulture)); 

Console.WriteLine(StringComparer.CurrentCulture.Equals("\"", "⁍")); 
Console.WriteLine(StringComparer.CurrentCulture.Equals("⁍", "\"")); 
Console.WriteLine(StringComparer.InvariantCulture.Equals("\"", "⁍")); 
Console.WriteLine(StringComparer.InvariantCulture.Equals("⁍", "\"")); 

Console.WriteLine("\"".CompareTo("⁍")); 
Console.WriteLine("⁍".CompareTo("\"")); 

Console.WriteLine(StringComparer.CurrentCulture.Compare("\"", "⁍")); 
Console.WriteLine(StringComparer.CurrentCulture.Compare("⁍", "\"")); 
Console.WriteLine(StringComparer.InvariantCulture.Compare("\"", "⁍")); 
Console.WriteLine(StringComparer.InvariantCulture.Compare("⁍", "\"")); 

Altri esempi avrebbero potuto essere determinato, per esempio i metodi static su string, ma sono equivalenti.

Con un numero ordinale confronto , certamente U + 0022 deve essere diverso da (meno di) U + 204d (che è semplice!):

// ordinal: 

Console.WriteLine("\"".StartsWith("⁍", StringComparison.Ordinal)); 
Console.WriteLine("⁍".StartsWith("\"", StringComparison.Ordinal)); 

Console.WriteLine("\"".Equals("⁍")); 
Console.WriteLine("⁍".Equals("\"")); 

Console.WriteLine(StringComparer.Ordinal.Equals("\"", "⁍")); 
Console.WriteLine(StringComparer.Ordinal.Equals("⁍", "\"")); 

Console.WriteLine(StringComparer.Ordinal.Compare("\"", "⁍")); 
Console.WriteLine(StringComparer.Ordinal.Compare("⁍", "\"")); 
Problemi correlati