2015-01-15 16 views
5

Neden .net (Windows 8) altında bu dize karşılaştırması doğru döndürür?Neden " u0022" dizesi " u204D" dizesiyle başlıyor <a1>

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

Bu, tüm kültürler için geçerlidir ve eğer StartsWith'i bir Equals olarak değiştirirseniz, false değerini döndürür.

Bir StartsWith karşılaştırması için geçerli olan birçok farklı karakter var. Bu tuhaf bir Unicode kuralının parçası mı yoksa Windows'un kendi kuralları var mı?

+0

bir unicode doğru char ismini bak tablo. Unicode karşılaştırmaları inceliklidir. Örneğin, kubbe karşılaştırmalarında belirli karakterler (örneğin, sıfır genişlikli (olmayan) birleştirici veya belirli modifiye ediciler) göz ardı edilir. – CodesInChaos

+0

Basit kurallar istiyorsanız, sıralı karşılaştırma kullanın. – CodesInChaos

+0

@CodesInChaos Ordinal'e geçmek isterim ve bu ve diğer birçok kişi geldiğinde olası kırılma değişikliklerinden geçiyorum. – Zoom

cevap

0

Kültüre bağlı dize karşılaştırmaları altında hangi kuralların bulunduğunu bilmek kolay değildir. U + 0022 " (QUOTATION MARK) ve U + 204D (BLACK RIGHTWARDS BULLET) noktalamalarının, kültür karşılaştırmaları altında (değişmez kültürünkiler dahil) "eşit" olduğu düşünülüyor.

// 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("⁍", "\"")); 

Diğer örnekler string örneğin, static yöntemleri verilmiş olabilir, ama bunlar eşdeğerdir: Bu örnekler bütün olduğunu göstermektedir. Bir sıralı karşılaştırma kesinlikle U + 0022 (az) farklı olmalıdır sayesinde

U + 204D (bu kadar basit!):

// 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("⁍", "\"")); 
İlgili konular