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

  • EmmightySofia

    EmmightySofi

    25 EYLÜL 2011
  • Influencer Plus

    Influencer P

    2 Ocak 2013
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006