.NET Tip #6: Čisté odstranění diakritiky

Tomáš Jecha, MVP, MCSD       05.10.2008       C#, VB.NET, .NET Tips       22847 zobrazení

Čas od času potřebujeme v textovém řetězci nahradit znaky diakritiky za jejich ekvivaltní normální. Většinou se to řeší výčtem všech znaků a následným procházením celého textu a nahrazováním. Málokdo ale ví, že unicode znaková sada nabízí řadu funkcí se kterými lze snadno diakritiku oddělit a zrušit. Sepsaná funkce pro Visual Basic vypadá takto:

Public Function RemoveDiacritism(ByVal Text As String) As String
    Dim stringFormD = Text.Normalize(System.Text.NormalizationForm.FormD)
    Dim retVal As New System.Text.StringBuilder()
    For index As Integer = 0 To stringFormD.Length - 1
        If (System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stringFormD(index)) <> Globalization.UnicodeCategory.NonSpacingMark) Then
            retVal.Append(stringFormD(index))
        End If
    Next
    Return retVal.ToString().Normalize(System.Text.NormalizationForm.FormC)
End Function

A kód pro C#:

public static string RemoveDiacritism(string Text)
{
    string stringFormD = Text.Normalize(System.Text.NormalizationForm.FormD);
    System.Text.StringBuilder retVal = new System.Text.StringBuilder();
    for(int index = 0; index < stringFormD.Length ; index ++)
    {
        if(System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stringFormD[index]) != System.Globalization.UnicodeCategory.NonSpacingMark)
            retVal.Append(stringFormD[index]);
    }
    return retVal.ToString().Normalize(System.Text.NormalizationForm.FormC);
}

Celé je to velmi jednoduché. Nejdříve se normalizuje text do podoby D. To znamená, že diakritické znaky, které jsou v unicode označovány jako NonSpacingMark (přivazují se k předešlému písmenu), se umístí do textu samostatně (například "něco" se převede na "neˇco"). Pak stačí jen vše projít a tyto NonSpacingMark znaky vyházet.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: .NET Tip #6: Čisté odstranění diakritiky

Melo by to odstranit i non-url znaky (uvozovky apod?)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Zkoušel jste to? :)

Podle toho co jsem psal, by mělo být jasné, že nikoliv. Uvozovky se přeci neváží na předchozí znak a proto tam zůstanou. Číštění od znaků nepovolené v adrese se dělá úplně jinak. S unicodem to nemá nic společného.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Ja som to skúšal, ale napríklad pre ž a ť to nefunguje.

Pred nimi sa mi zobrazuje vždy nejaký štvorček.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback