Skip to content

Instantly share code, notes, and snippets.

@alisterlf
Created August 27, 2012 18:10
Show Gist options
  • Star 58 You must be signed in to star a gist
  • Fork 24 You must be signed in to fork a gist
  • Save alisterlf/3490957 to your computer and use it in GitHub Desktop.
Save alisterlf/3490957 to your computer and use it in GitHub Desktop.
JAVASCRIPT:Remove Accents
function RemoveAccents(strAccents) {
var strAccents = strAccents.split('');
var strAccentsOut = new Array();
var strAccentsLen = strAccents.length;
var accents = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
var accentsOut = "AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";
for (var y = 0; y < strAccentsLen; y++) {
if (accents.indexOf(strAccents[y]) != -1) {
strAccentsOut[y] = accentsOut.substr(accents.indexOf(strAccents[y]), 1);
} else
strAccentsOut[y] = strAccents[y];
}
strAccentsOut = strAccentsOut.join('');
return strAccentsOut;
}
@Knud13
Copy link

Knud13 commented Sep 4, 2018

I think the German eszett ß should be an "s" https://en.wikipedia.org/wiki/%C3%9F
β is the greek beta https://en.wikipedia.org/wiki/Beta and that should probably be a "B"

@jpbberry
Copy link

jpbberry commented Sep 30, 2018

Added a few

var accents = 'ÀÁÂÃÄÅĄĀāàáâãäåąßÒÓÔÕÕÖØŐòóôőõöøĎďDŽdžÈÉÊËĘèéêëęðÇçČčĆćÐÌÍÎÏĪìíîïīÙÚÛÜŰùűúûüĽĹŁľĺłÑŇŃňñńŔŕŠŚŞšśşŤťŸÝÿýŽŻŹžżźđĢĞģğ';
var accentsOut = "AAAAAAAAaaaaaaaasOOOOOOOOoooooooDdDZdzEEEEEeeeeeeCcCcCcDIIIIIiiiiiUUUUUuuuuuLLLlllNNNnnnRrSSSsssTtYYyyZZZzzzdGGgg";

@oliversisson
Copy link

oliversisson commented Oct 15, 2018

How about this?

var nIC = new Intl.Collator(undefined, {sensitivity: 'base'})
var cmp = nIC.compare.bind(nIC)

Or this?

'être'.localeCompare('etre', undefined, {sensitivity: 'base'})

@Valegox
Copy link

Valegox commented Dec 12, 2018

Just... thank you !

@hotdang-ca
Copy link

Though I prefer the map method, here's the original but TypeScript-friendly:

private replaceAccents(str: string): string
{
    const ACCENTS = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
    const NON_ACCENTS = "AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";

    const strAccents: string[] = str.split('');
    const strAccentsOut: string[] = new Array();

    const strAccentsLen: number = strAccents.length;

    for (let y = 0; y < strAccentsLen; y++) 
    {
        if (ACCENTS.indexOf(strAccents[y]) != -1)
        {
            strAccentsOut[y] = NON_ACCENTS.substr(ACCENTS.indexOf(strAccents[y]), 1);
        } 
        else
        {
                strAccentsOut[y] = strAccents[y];
        }
    }

    const newString: string = strAccentsOut.join('');
    return newString;
}

@tomjohnburton
Copy link

A slight alternative to above using the string normalisation AND correct substitution for the German ß

import { includes, some } from 'lodash'

export default function convertForeignCharacters(str: string): string {
  const strAccents: string[] = str.split('')
  const strAccentsOut: string[] = new Array()

  const strAccentsLen: number = strAccents.length

  for (let y: number = 0; y < strAccentsLen; y++) {
    if (!some(['ä', 'ü', 'ö'], (el: string) => includes(strAccents[y], el))) {
      strAccentsOut[y] = strAccents[y].normalize('NFD').replace(/[\u0300-\u036f]/g, '')
    } else {
      strAccentsOut[y] = strAccents[y]
    }
  }

  const newString: string = strAccentsOut.join('').replace('ß', 'ss')
  return newString
}

@lsarrazi
Copy link

lsarrazi commented Aug 6, 2020

O(n) version, ~5x faster, especially if you want add more accents.

const accents = 'ÀÁÂÃÄÅĄĀāàáâãäåąßÒÓÔÕÕÖØŐòóôőõöøĎďDŽdžÈÉÊËĘèéêëęðÇçČčĆćÐÌÍÎÏĪìíîïīÙÚÛÜŰùűúûüĽĹŁľĺłÑŇŃňñńŔŕŠŚŞšśşŤťŸÝÿýŽŻŹžżźđĢĞģğ',
	accents_out = "AAAAAAAAaaaaaaaasOOOOOOOOoooooooDdDZdzEEEEEeeeeeeCcCcCcDIIIIIiiiiiUUUUUuuuuuLLLlllNNNnnnRrSSSsssTtYYyyZZZzzzdGGgg",
	accents_map = new Map();
for (const i in accents)
	accents_map.set(accents.charCodeAt(i), accents_out.charCodeAt(i))

function removeAccents(str) {
	const nstr = new Array(str.length);
	let x, i;
	for (i = 0; i < nstr.length; i++)
		nstr[i] = accents_map.get(x = str.charCodeAt(i)) || x;
	return String.fromCharCode.apply(null, nstr);
}

@CramericaIndustries
Copy link

@ArthurMaroulier
FYI: It doesn't cover all letters ('Ø' for example).

"ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž".normalize('NFD').replace(/[\u0300-\u036f]/g, "");
"AAAAAAaaaaaaOOOOOOØoooooøEEEEeeeeðCcÐIIIIiiiiUUUUuuuuNnSsYyyZz"

@jrking365
Copy link

did you find a way to convert Ø please ?

@yosietserga
Copy link

yosietserga commented May 28, 2021

@alisterlf
Copy link
Author

If your goal is to sort a list of strings, disregarding accents

['André', 'Álister', 'alan'].sort(new Intl.Collator('pt-BR').compare)

Or just to be safe

['André', 'Álister', 'alan'].sort(new Intl.Collator('pt-BR', {sensitivity:'base'}).compare)

@NicolasPlanas1998
Copy link

Other variant could be..
const removeAccents = (str) => { return str .toLowerCase() .normalize("NFD") .replace(/[\u0300-\u036f]/g, ""); };

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment