Č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.