Skip to content

Instantly share code, notes, and snippets.

@GuilhermeMatheus
Created May 30, 2016 19:52
Show Gist options
  • Select an option

  • Save GuilhermeMatheus/1e65c4cc118768ac3047433046f7dab4 to your computer and use it in GitHub Desktop.

Select an option

Save GuilhermeMatheus/1e65c4cc118768ac3047433046f7dab4 to your computer and use it in GitHub Desktop.
An optimized method to diacritics removal. Ugly code, but much faster than regex.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Costa.Utils.Text
{
public static class ReplaceMachine
{
public static string DiacriticsAndSpaceRemoval(string baseStr)
{
return DiacriticsRemoval(baseStr, new Dictionary<char, char> { { ' ', '_' } });
}
public static string DiacriticsRemoval(string baseStr, Dictionary<char, char> fallBack = null)
{
bool hasFallBack = fallBack != null;
var builder = new StringBuilder();
for (int i = 0; i < baseStr.Length; i++)
{
var c = baseStr[i];
switch (c)
{
case '\u0041': case '\u24B6': case '\uFF21': case '\u00C0': case '\u2C6F': case '\u1E00':
case '\u00C1': case '\u00C2': case '\u1EA6': case '\u1EA4': case '\u1EAA': case '\u1EB6':
case '\u1EA8': case '\u00C3': case '\u0100': case '\u0102': case '\u1EB0': case '\u023A':
case '\u1EAE': case '\u1EB4': case '\u1EB2': case '\u0226': case '\u01E0': case '\u0104':
case '\u00C4': case '\u01DE': case '\u1EA2': case '\u00C5': case '\u01FA': case '\u1EAC':
case '\u01CD': case '\u0200': case '\u0202': case '\u1EA0':
c = 'A';
break;
case '\u0043': case '\u24B8': case '\uFF23': case '\u0106': case '\u0108': case '\uA73E':
case '\u010A': case '\u010C': case '\u00C7': case '\u1E08': case '\u0187': case '\u023B':
c = 'C';
break;
case '\u0045': case '\u24BA': case '\uFF25': case '\u00C8': case '\u00C9': case '\u00CA':
case '\u1EC0': case '\u1EBE': case '\u1EC4': case '\u1EC2': case '\u1EBC': case '\u0112':
case '\u1E14': case '\u1E16': case '\u0114': case '\u0116': case '\u00CB': case '\u1EBA':
case '\u011A': case '\u0204': case '\u0206': case '\u1EB8': case '\u1EC6': case '\u0228':
case '\u1E1C': case '\u0118': case '\u1E18': case '\u1E1A': case '\u0190': case '\u018E':
c = 'E';
break;
case '\u0049': case '\u24BE': case '\uFF29': case '\u00CC': case '\u00CD': case '\u00CE':
case '\u0128': case '\u012A': case '\u012C': case '\u0130': case '\u00CF': case '\u1E2E':
case '\u1EC8': case '\u01CF': case '\u0208': case '\u020A': case '\u1ECA': case '\u012E':
case '\u1E2C': case '\u0197':
c = 'I';
break;
case '\u004F': case '\u24C4': case '\uFF2F': case '\u00D2': case '\u00D3': case '\u00D4':
case '\u1ED2': case '\u1ED0': case '\u1ED6': case '\u1ED4': case '\u00D5': case '\u1E4C':
case '\u022C': case '\u1E4E': case '\u014C': case '\u1E50': case '\u1E52': case '\u014E':
case '\u022E': case '\u0230': case '\u00D6': case '\u022A': case '\u1ECE': case '\u0150':
case '\u01D1': case '\u020C': case '\u020E': case '\u01A0': case '\u1EDC': case '\u1EDA':
case '\u1EE0': case '\u1EDE': case '\u1EE2': case '\u1ECC': case '\u1ED8': case '\u01EA':
case '\u01EC': case '\u00D8': case '\u01FE': case '\u0186': case '\u019F': case '\uA74A':
case '\uA74C':
c = 'O';
break;
case '\u0055': case '\u24CA': case '\uFF35': case '\u00D9': case '\u00DA': case '\u00DB':
case '\u0168': case '\u1E78': case '\u016A': case '\u1E7A': case '\u016C': case '\u00DC':
case '\u01DB': case '\u01D7': case '\u01D5': case '\u01D9': case '\u1EE6': case '\u016E':
case '\u0170': case '\u01D3': case '\u0214': case '\u0216': case '\u01AF': case '\u1EEA':
case '\u1EE8': case '\u1EEE': case '\u1EEC': case '\u1EF0': case '\u1EE4': case '\u1E72':
case '\u0172': case '\u1E76': case '\u1E74': case '\u0244':
c = 'U';
break;
case '\u0061': case '\u24D0': case '\uFF41': case '\u1E9A': case '\u00E0': case '\u00E1':
case '\u00E2': case '\u1EA7': case '\u1EA5': case '\u1EAB': case '\u1EA9': case '\u00E3':
case '\u0101': case '\u0103': case '\u1EB1': case '\u1EAF': case '\u1EB5': case '\u1EB3':
case '\u0227': case '\u01E1': case '\u00E4': case '\u01DF': case '\u1EA3': case '\u00E5':
case '\u01FB': case '\u01CE': case '\u0201': case '\u0203': case '\u1EA1': case '\u1EAD':
case '\u1EB7': case '\u1E01': case '\u0105': case '\u2C65': case '\u0250':
c = 'a';
break;
case '\u0063': case '\u24D2': case '\uFF43': case '\u0107': case '\u0109': case '\u010B':
case '\u010D': case '\u00E7': case '\u1E09': case '\u0188': case '\u023C': case '\uA73F':
case '\u2184':
c = 'c';
break;
case '\u0065': case '\u24D4': case '\uFF45': case '\u00E8': case '\u00E9': case '\u00EA':
case '\u1EC1': case '\u1EBF': case '\u1EC5': case '\u1EC3': case '\u1EBD': case '\u0113':
case '\u1E15': case '\u1E17': case '\u0115': case '\u0117': case '\u00EB': case '\u1EBB':
case '\u011B': case '\u0205': case '\u0207': case '\u1EB9': case '\u1EC7': case '\u0229':
case '\u1E1D': case '\u0119': case '\u1E19': case '\u1E1B': case '\u0247': case '\u025B':
case '\u01DD':
c = 'e';
break;
case '\u0069': case '\u24D8': case '\uFF49': case '\u00EC': case '\u00ED': case '\u00EE':
case '\u0129': case '\u012B': case '\u012D': case '\u00EF': case '\u1E2F': case '\u1EC9':
case '\u01D0': case '\u0209': case '\u020B': case '\u1ECB': case '\u012F': case '\u1E2D':
case '\u0268': case '\u0131':
c = 'i';
break;
case '\u006F': case '\u24DE': case '\uFF4F': case '\u00F2': case '\u00F3': case '\u00F4':
case '\u1ED3': case '\u1ED1': case '\u1ED7': case '\u1ED5': case '\u00F5': case '\u1E4D':
case '\u022D': case '\u1E4F': case '\u014D': case '\u1E51': case '\u1E53': case '\u014F':
case '\u022F': case '\u0231': case '\u00F6': case '\u022B': case '\u1ECF': case '\u0151':
case '\u01D2': case '\u020D': case '\u020F': case '\u01A1': case '\u1EDD': case '\u1EDB':
case '\u1EE1': case '\u1EDF': case '\u1EE3': case '\u1ECD': case '\u1ED9': case '\u01EB':
case '\u01ED': case '\u00F8': case '\u01FF': case '\u0254': case '\uA74B': case '\uA74D':
case '\u0275':
c = 'o';
break;
case '\u0075': case '\u24E4': case '\uFF55': case '\u00F9': case '\u00FA': case '\u00FB':
case '\u0169': case '\u1E79': case '\u016B': case '\u1E7B': case '\u016D': case '\u00FC':
case '\u01DC': case '\u01D8': case '\u01D6': case '\u01DA': case '\u1EE7': case '\u016F':
case '\u0171': case '\u01D4': case '\u0215': case '\u0217': case '\u01B0': case '\u1EEB':
case '\u1EE9': case '\u1EEF': case '\u1EED': case '\u1EF1': case '\u1EE5': case '\u1E73':
case '\u0173': case '\u1E77': case '\u1E75': case '\u0289':
c = 'u';
break;
default:
if (hasFallBack && fallBack.ContainsKey(c))
c = fallBack[c];
break;
}
builder.Append(c);
}
return builder.ToString();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment