Created
September 28, 2016 20:30
-
-
Save dimiro1/b298bb18fcd118bbb5f236682f810cfc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// NormalizeString remove noise chars | |
// https://blog.golang.org/normalization | |
// See http://www.fileformat.info/info/unicode/category/index.htm | |
// No formato NFC cada caractere é representado por um único simbolo | |
// ex: "é"" no formato NFC == "\u00e9"" | |
// No formato NFD o mesmo caractere é representado por "e\u0301" | |
// Após converter para NFD fica fácil remover os caracteres extras, apenas passando de byte a byte | |
// Ao final é necessária a conversão para o formato normalizado NFKD que trata caracteres semelhantes | |
// como sendo o mesmo símbolo: ex: 'Ω' ("\u03a9") e 'Ω' (Ohm sign "\u2126") podem ser considerados a mesma coisa | |
func NormalizeString(s string) (string, error) { | |
t := transform.Chain( | |
norm.NFD, | |
runes.Remove(runes.In(unicode.Co)), | |
runes.Remove(runes.In(unicode.Cs)), | |
runes.Remove(runes.In(unicode.Cf)), | |
runes.Remove(runes.In(unicode.Lm)), | |
runes.Remove(runes.In(unicode.Mn)), | |
runes.Remove(runes.In(unicode.Me)), | |
runes.Remove(runes.In(unicode.Mc)), | |
runes.Remove(runes.In(unicode.Pc)), | |
runes.Remove(runes.In(unicode.Pi)), | |
runes.Remove(runes.In(unicode.Zl)), | |
runes.Remove(runes.In(unicode.Zp)), | |
norm.NFKD, | |
// Normalização do superscript 13º para 13o | |
runes.Map(func(r rune) rune { | |
switch r { | |
case '¤', '•', '\'', '°': | |
return 'o' | |
default: | |
return r | |
} | |
}), | |
// convert various whitespace runes into a whitespace | |
runes.Map(func(r rune) rune { | |
if unicode.IsSpace(r) { | |
return ' ' | |
} | |
return r | |
}), | |
// Remove extra spaces | |
runes.Remove(runes.Predicate(func() func(rune) bool { | |
isWhiteSpace := unicode.IsSpace(rune(s[0])) | |
return func(r rune) bool { | |
if isWhiteSpace && unicode.IsSpace(r) { | |
return true | |
} | |
if unicode.IsSpace(r) { | |
isWhiteSpace = true | |
} else { | |
isWhiteSpace = false | |
} | |
return false | |
} | |
}())), | |
runes.Map(unicode.ToLower), | |
) | |
s1, _, err := transform.String(t, s) | |
return s1, err | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment