StartsWith
tarafından döndürülen sonuç doğrudur. Varsayılan olarak, çoğu dize karşılaştırma yöntemleri, düz bayt dizileri değil, geçerli kültürü kullanarak kültüre duyarlı karşılaştırmalar gerçekleştirir. line
, sub
ile aynı bayt dizisi ile başlamasına rağmen, temsil ettiği alt tabaka çoğu (veya tüm) kültürün altında eşdeğer değildir.
gerçekten aşırı kullanmak, düz bayt dizileri olarak dizeleri davranır bir karşılaştırma isterseniz:
line.StartsWith(sub, StringComparison.OrdinalIgnoreCase); // true
Burada daha var: küçük harf duyarsız olması
line.StartsWith(sub, StringComparison.Ordinal); // true
İsterseniz karşılaştırılması bilinen bir örnek: yukarıdaki örneklerde
var line1 = "café"; // 63 61 66 E9 – precomposed character 'é' (U+00E9)
var line2 = "café"; // 63 61 66 65 301 – base letter e (U+0065) and
// combining acute accent (U+0301)
var sub = "cafe"; // 63 61 66 65
Console.WriteLine(line1.StartsWith(sub)); // false
Console.WriteLine(line2.StartsWith(sub)); // false
Console.WriteLine(line1.StartsWith(sub, StringComparison.Ordinal)); // false
Console.WriteLine(line2.StartsWith(sub, StringComparison.Ordinal)); // true
, line2
sub
ile aynı bayt dizisi ile başlar, ardından son e
'a uygulanacak bir akıcı vurgu (U + 0301) gelir. line1
, é
(U + 00E9) için precomposed character kullanır, bu nedenle bayt dizisi sub
ile eşleşmez. Gerçek dünya semantiklerinde, café
; e
ve é
, ayrı karakterler olarak kabul edilir. Bu é
'un, e
ile başlayan bir çift karakter olarak temsil edilmesinin, sonuçları etkilememesi gereken kodlama şemasının (Unicode) bir iç uygulama ayrıntısı olduğu gösterilir. Bu, yukarıdaki örnek zıt café
ve café
; Bir ordinal (byte-by-byte) karşılaştırmayı özellikle amaçlamadıkça, farklı sonuçlar beklemez.
sizin örneğe bu açıklamayı uyarlanması:
string line = "Mìng-dĕ̤ng-ngṳ̄"; // 4D EC 6E 67 2D 64 115 324 6E 67 2D 6E 67 1E73 304
string sub = "Mìng-dĕ̤ng-ngṳ"; // 4D EC 6E 67 2D 64 115 324 6E 67 2D 6E 67 1E73
Her .NET karakter, değerleri yukarıdaki açıklamalar gösterilmektedir UTF-16 kod birimini temsil eder. İlk 14 kod birimi aynıdır, bu nedenle char-by-char karşılaştırmanız doğru olarak değerlendirilir (tıpkı StringComparison.Ordinal
gibi). Bununla birlikte, line
'daki 15. kod birimi, ṳ̄
vermek üzere önceki ṳ
(U+1E73) ile birleştiren birleştirici makron, ◌̄ (U+0304) 'dur.
kullanın değişmez bir kültürü. Örneğin, bkz. Http://stackoverflow.com/q/492799/1364007 –
Vietnamca bilmiyorum. Sonun üzerinde bir çizgi var. Bu farklı bir harf yapmaz mı? * Düzenleme: * Uzunluğunu yazdırdığınızı özledim, ki bu satırın * başka * karakter olarak kabul edildiğini gösteriyor ... ilginç. –
Bana öyle geliyor ki 'StartsWith()' Yanlış döndürmesi gerek, çünkü (Jonathon'un işaret ettiği gibi), 'satır' aslında 'sub' ile başlamıyor. –