Skip to content

Instantly share code, notes, and snippets.

@alisterlf
Created August 27, 2012 18:10
Show Gist options
  • Select an option

  • Save alisterlf/3490957 to your computer and use it in GitHub Desktop.

Select an option

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;
}
@espellcaste

Copy link
Copy Markdown

Really helpful! Thanks! =)

@davidgaroro

Copy link
Copy Markdown

I like it!.
I've modified it a little to less code:

function RemoveAccents(str) {
  var accents    = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
  var accentsOut = "AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";
  str = str.split('');
  var strLen = str.length;
  var i, x;
  for (i = 0; i < strLen; i++) {
    if ((x = accents.indexOf(str[i])) != -1) {
      str[i] = accentsOut[x];
    }
  }
  return str.join('');
}

Thank you!

@mrchess

mrchess commented Feb 10, 2017

Copy link
Copy Markdown

Doesn't cover ß

@b4dnewz

b4dnewz commented Oct 2, 2017

Copy link
Copy Markdown

with ß:

function RemoveAccents(str) {
  var accents    = 'ÀÁÂÃÄÅàáâãäåßÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
  var accentsOut = "AAAAAAaaaaaaBOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";
  str = str.split('');
  var strLen = str.length;
  var i, x;
  for (i = 0; i < strLen; i++) {
    if ((x = accents.indexOf(str[i])) != -1) {
      str[i] = accentsOut[x];
    }
  }
  return str.join('');
}

@yamid

yamid commented Oct 13, 2017

Copy link
Copy Markdown

with ES6:

function removeAccents(str) {
  let accents = 'ÀÁÂÃÄÅàáâãäåßÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
  let accentsOut = "AAAAAAaaaaaaBOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";
  str = str.split('');
  str.forEach((letter, index) => {
    let i = accents.indexOf(letter);
    if (i != -1) {
      str[index] = accentsOut[i];
    }
  })
  return str.join('');
}

@max1020

max1020 commented Nov 7, 2017

Copy link
Copy Markdown

if someone needs slovak letters:
ÝŤŔŇĽĹDŽĎČ were missing

	'ÀÁÂÃÄÅàáâãäåßÒÓÔÕÕÖØòóôõöøĎďDŽdžÈÉÊËèéêëðÇçČčÐÌÍÎÏìíîïÙÚÛÜùúûüĽĹľĺÑŇňñŔ੹ŤťŸÝÿýŽž';
	"AAAAAAaaaaaasOOOOOOOooooooDdDZdzEEEEeeeeeCcCcDIIIIiiiiUUUUuuuuLLllNNnnRrSsTtYYyyZz";

@SamirSouzaSys

Copy link
Copy Markdown

Thanks!!

@ArthurMaroulier

Copy link
Copy Markdown

What about this ? It's shorter :)
str.normalize('NFD').replace(/[\u0300-\u036f]/g, "")

@jcezarms

jcezarms commented Jan 4, 2018

Copy link
Copy Markdown

It really is, Arthur, thank you! It's good to also point to the original, mainly for its complete explanation.

@HUN-Julian

HUN-Julian commented Jan 18, 2018

Copy link
Copy Markdown

...with special hungarian characters:

  let accents = 'ÀÁÂÃÄÅàáâãäåßÒÓÔÕÕÖØŐòóôőõöøĎďDŽdžÈÉÊËèéêëðÇçČčÐÌÍÎÏìíîïÙÚÛÜŰùűúûüĽĹľĺÑŇňñŔ੹ŤťŸÝÿýŽž';
  let accentsOut = "AAAAAAaaaaaasOOOOOOOOoooooooDdDZdzEEEEeeeeeCcCcDIIIIiiiiUUUUUuuuuuLLllNNnnRrSsTtYYyyZz";

ghost commented Jan 20, 2018

Copy link
Copy Markdown

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

@FerreiraRaphael

FerreiraRaphael commented Feb 16, 2018

Copy link
Copy Markdown

with map:

function removeAccents(string) {
      const accents =
        "ÀÁÂÃÄÅàáâãäåßÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž";
      const accentsOut =
        "AAAAAAaaaaaaBOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";
      return string
        .split("")
        .map((letter, index) => {
          const accentIndex = accents.indexOf(letter);
          return accentIndex !== -1 ? accentsOut[accentIndex] : letter;
        })
        .join("");
    }

@smietanka

Copy link
Copy Markdown

@up with polish special characters

function removeAccents(string) {
      const accents =
        "ÀÁÂÃÄÅĄàáâãäåąßÒÓÔÕÕÖØÓòóôõöøóÈÉÊËĘèéêëęðÇĆçćÐÌÍÎÏìíîïÙÚÛÜùúûüÑŃñńŠŚšśŸÿýŽŻŹžżź";
      const accentsOut =
        "AAAAAAAaaaaaaaBOOOOOOOOoooooooEEEEEeeeeeeCCccDIIIIiiiiUUUUuuuuNNnnSSssYyyZZZzzz";
      return string
        .split("")
        .map((letter, index) => {
          const accentIndex = accents.indexOf(letter);
          return accentIndex !== -1 ? accentsOut[accentIndex] : letter;
        })
        .join("");
    }

@brunoocasali

Copy link
Copy Markdown

If you use ES6 consider this Stack answer: https://stackoverflow.com/a/37511463/2649707

@darkylmnx

Copy link
Copy Markdown

@brunoocasali doesn't work with "œ" char, like in "Cœur"

@juancama

Copy link
Copy Markdown

Other variant without constants

function normalizeString (string) {
  return string.split('').map(function (letter) {
      let i = this.accents.indexOf(letter)
      return (i !== -1) ? this.out[i] : letter
    }.bind({
      accents: 'ÀÁÂÃÄÅĄàáâãäåąßÒÓÔÕÕÖØÓòóôõöøóÈÉÊËĘèéêëęðÇĆçćÐÌÍÎÏìíîïÙÚÛÜùúûüÑŃñńŠŚšśŸÿýŽŻŹžżź',
      out: 'AAAAAAAaaaaaaaBOOOOOOOOoooooooEEEEEeeeeeeCCccDIIIIiiiiUUUUuuuuNNnnSSssYyyZZZzzz'
    })
  ).join('')
}

@Knud13

Knud13 commented Sep 4, 2018

Copy link
Copy Markdown

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

jpbberry commented Sep 30, 2018

Copy link
Copy Markdown

Added a few

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

@oliversisson

oliversisson commented Oct 15, 2018

Copy link
Copy Markdown

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

Valegox commented Dec 12, 2018

Copy link
Copy Markdown

Just... thank you !

@hotdang-ca

Copy link
Copy Markdown

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
Copy Markdown

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

lsarrazi commented Aug 6, 2020

Copy link
Copy Markdown

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
Copy Markdown

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

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

@jrking365

Copy link
Copy Markdown

did you find a way to convert Ø please ?

@yosietserga

yosietserga commented May 28, 2021

Copy link
Copy Markdown

@alisterlf

Copy link
Copy Markdown
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)

@NicolasPlanass

Copy link
Copy Markdown

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

@adrianpopescu-expertnetwork

Copy link
Copy Markdown

Hello! All the above examples are good! However, I put the function at onChange event on an input field and the next character duplicates all the string from the input. Is there any solution to prevent this? Thank you!

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