SORU
11 Aralık 2008, PERŞEMBE


Görmezden dize karşılaştırma harf aksanlı

C 2 dizeleri ihtiyacım var# ve aksanlı harf olmayan aksanlı harfler gibi aynı şekilde davran. Örneğin:

string s1 = "hello";
string s2 = "héllo";

s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase);
s1.Equals(s2, StringComparison.OrdinalIgnoreCase);

Bu 2 dizi aynı olması gerekiyor (benim uygulama ile ilgili olarak), ama bu tabloların her ikisi de yanlış değerlendirmesi. C bir yoldur# bunu yapmak için?

CEVAP
15 Aralık 2008, PAZARTESİ


2012-01-20 EDİT: Aman! Çözüm çok daha basit ve bu çerçevede neredeyse sonsuza kadar olmuştur. As pointed out by knightpfhor :

string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);

İşte bir dize: aksan şeritler bir işlev

static string RemoveDiacritics(string text)
{
  string formD = text.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  foreach (char ch in formD)
  {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
    if (uc != UnicodeCategory.NonSpacingMark)
    {
      sb.Append(ch);
    }
  }

  return sb.ToString().Normalize(NormalizationForm.FormC);
}

Daha fazla ayrıntı 11**.

Prensip bu döner 'o' içine üst üste 2 karakter 'e', akut. O zaman karakter arasında dolaşır ve aksan atlar.

< . p ^"" "O<akut>llo teslim olur","". Merhaba olur héllo

Debug.Assert("hello"==RemoveDiacritics("héllo"));

Not: Burada bir daha kompakt .Aynı işlevi NET4 dostu sürüm:

static string RemoveDiacritics(string text)
{
  return string.Concat( 
      text.Normalize(NormalizationForm.FormD)
      .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
                                    UnicodeCategory.NonSpacingMark)
    ).Normalize(NormalizationForm.FormC);
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • case LianLi

    case LianLi

    28 Mayıs 2010
  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009
  • Michael Lummio

    Michael Lumm

    25 Mayıs 2007