SORU
13 Temmuz 2012, Cuma


someString.Adres bilgisi(someString) 0 yerine 1 altında verir .NET 4

Son zamanlarda tüm projeleri yükselttiniz .NET 3.5 .NET 4. string.IndexOf() açısından oldukça garip bir sorunla karşılaştım.

Benim kod açıkçası biraz farklı bir şey yok, ama konu soruşturma sürecinde, kendisi ile bir dize üzerinde IndexOf() arama 0 yerine 1 iade bulundu. Diğer bir deyişle:

string text = "\xAD\x2D";          // problem happens with "­-dely N.China", too;
int index = text.IndexOf(text);    // see update note below.

0 yerine 1, Bir dizin verdi bana. Bu sorun hakkında dikkat edilmesi gereken birkaç şey:

  • Sorunlar bu tire (ilk karakter ikinci düzenli bir tire işareti Unicode yumuşak tire) ile ilgili gibi görünüyor.

  • Kontrol ettim çift, bu olmaz .NET 3.5 ama yok .NET 4.

  • Bir sıra yapmak için IndexOf() değiştirerek sorunu giderir karşılaştırın, nedense ilk karakter varsayılan IndexOf ile göz ardı edilir.

Herkes bu durumda neden biliyor mu?

EDİT

Üzgünüm Beyler, bir şeyler biraz özgün yazı üzerine yapılan ve iki kez orada gizli çizgi var. Bu dize, bu 2, doğru editör yapıştırdıktan sürece yerine 1 dizin dönmesi gerekir güncelledik.

Güncelleme:

Her gerçek karakterini açıkça görülebilir (kaçan kullanarak) olduğu için orijinal sorun dize değişti. Bu soru biraz kolaylaştırır.

CEVAP
13 Temmuz 2012, Cuma


Dizesi var iki karakter: soft hyphen (Unicode kod noktası 173) ve hyphen (Unicode kod noktası 45).

Wiki: Unicode standardına Göre, yumuşak bir tire işareti varsa, bu noktada bozuk değilse görüntülenmez.

"\xAD\x2D".IndexOf("\xAD\x2D") kullanırken .NET yumuşak tire aradığınız görmezden görünüyor 4,, 1 (\x2D Endeksi) başlangıç dizini dönüyor. .NET 3.5, 0 değerini döndürür.

Eğer bu kodu çalıştırırsanız daha eğlenceli (çok zamansadeceyumuşak tire) arıyor:

string text = "\xAD\x2D";
string shy = "\xAD";
int i1 = text.IndexOf(shy);

sonra i1 0 olur, ne olursa olsun .NET sürüm kullanılır. text.IndexOf(text); sonucu bir bakışta bana bir hata gibi görünüyor gerçekten de değişir.

Çerçeve ile tekrar eski parça bildiğim kadarıyla .NET sürümleri IndexOfString() (Bu gider için çözemedim) InternalCall bir kullanın .NET 4.

Bu mesele gerçekten bu davranış amaçlanan ise anlayabilmiş değilim) gerçekten FindNLSStringEx arama oluşur

LPCWSTR lpStringSource = L"\xAD\x2D";
LPCWSTR lpStringValue = L"\xAD";

int length;

int i = FindNLSStringEx(
    LOCALE_NAME_SYSTEM_DEFAULT,
    FIND_FROMSTART,
    lpStringSource,
    -1,
    lpStringValue,
    -1,
    &length,
    NULL,
    NULL,
    1);

Console::WriteLine(i);

i = FindNLSStringEx(
    LOCALE_NAME_SYSTEM_DEFAULT,
    FIND_FROMSTART,
    lpStringSource,
    -1,
    lpStringSource,
    -1,
    &length,
    NULL,
    NULL,
    1);

Console::WriteLine(i);

Console::ReadLine();

Baskı 0 ve 1. Not length bir parametre belirten uzunluğu bulunan dize, 0 sonraki ilk arama ve sonrasında 1 saniye; yumuşak tire işareti sayılır kadar olan bir uzunluk 0.

Geçici belirtildiği gibi text.IndexOf(text, StringComparison.OrdinalIgnoreCase); kullanmaktır. Bu da her iki durumda 0 döndürür FindStringOrdinal(), çağrı InternalCompareStringOrdinalIgnoreCase() QCall yapar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boburnham

    boburnham

    11 Temmuz 2006
  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009