Skip to content

Instantly share code, notes, and snippets.

@dimiro1
Created September 28, 2016 20:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dimiro1/b298bb18fcd118bbb5f236682f810cfc to your computer and use it in GitHub Desktop.
Save dimiro1/b298bb18fcd118bbb5f236682f810cfc to your computer and use it in GitHub Desktop.
// 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