# Removing diacritical marks

**URL:** <https://www.ruby-forum.com/t/removing-diacritical-marks/55124>\
**Category:** Ruby\
**Created:** [March 17, 2006, 4:45am UTC](https://www.ruby-forum.com/t/removing-diacritical-marks/55124 "2006-03-17T04:45:50Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![paulbutcher](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a5b964/32.png) [@paulbutcher](https://www.ruby-forum.com/u/paulbutcher)\
**Post date:** [March 17, 2006, 4:45am UTC](https://www.ruby-forum.com/t/removing-diacritical-marks/55124/1 "2006-03-17T04:45:50Z")

</div>

Hello Rubyists,

I would like to remove the accents marks (a.k.a diacritical marks) from  
a  
String. Assuming “line” is a String, this gets most of them:

```
line.gsub!(/[Ã?ÃÃ?Ã?Ã?]/,"A")
line.gsub!(/[Ã¢Ã£Ã¤Ã Ã¡]/,"a")
line.gsub!(/[Ã?Ã?Ã?Ã?]/,"E")
line.gsub!(/[ÃªÃ«Ã¨Ã©]/,"e")
line.gsub!(/[Ã?ÃÃ?Ã]/,"I")
line.gsub!(/[Ã®Ã¯Ã¬Ã­]/,"i")
line.gsub!(/[Ã?Ã?Ã?Ã?Ã?]/,"O")
line.gsub!(/[Ã´ÃµÃ¶Ã²Ã³]/,"o")
line.gsub!(/[Ã?Ã?Ã?Ã?]/,"U")
line.gsub!(/[Ã»Ã¼Ã¹Ãº]/,"u")
line.gsub!(/Ã/,"Y")
line.gsub!(/Ã½/,"y")
line.gsub!(/Ã±/,"n")

```

Is there an easier/better way to do this?

---

<div class="post-metadata">

**Author:** ![paulbutcher](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a5b964/32.png) [@paulbutcher](https://www.ruby-forum.com/u/paulbutcher)\
**Post date:** [March 17, 2006, 5:10am UTC](https://www.ruby-forum.com/t/removing-diacritical-marks/55124/2 "2006-03-17T05:10:45Z")

</div>

Paul B. wrote:

> I would like to remove the accents marks (a.k.a diacritical marks) from a  
> String. Assuming “line” is a String, this gets most of them:
> 
> ```
> line.gsub!(/[ÀÁÂÃÄ]/,"A")
> 
> ```
> 
> …  
> Is there an easier/better way to do this?

Yes. There’s a potential problem with your way: if the accented  
characters  
are more than one byte (i.e. in any character set other than ASCII) each  
byte will be replaced with an A: “À” =\> “AA”.

This is safer: line.gsub!(/À|Á|Â|Ã|Ä]/,“A”)

I translated a method to do this from PHP earlier this year:  
[http://tinyurl.com/q8hlg](http://tinyurl.com/q8hlg) [Google G.]

Cheers,  
Dave

---

<div class="post-metadata">

**Author:** ![paulbutcher](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/a5b964/32.png) [@paulbutcher](https://www.ruby-forum.com/u/paulbutcher)\
**Post date:** [March 17, 2006, 10:50am UTC](https://www.ruby-forum.com/t/removing-diacritical-marks/55124/3 "2006-03-17T10:50:28Z")

</div>

> I translated a method to do this from PHP earlier this year:  
> [http://tinyurl.com/q8hlg](http://tinyurl.com/q8hlg) [Google G.]

Here’s a simpler version (hard-coded for UTF-8; it would need some  
tweaking for other encodings). It has a side effect of transliterating  
punctuation to ASCII as well, which may or may not be desirable.

Paul

* * *

$KCODE = ‘u’  
require ‘iconv’

class String  
def strip\_diacritics  
self.gsub(/[^\x20-\x7f]/){  
Iconv.iconv(‘us-ascii//IGNORE//TRANSLIT’, ‘utf-8’,  
$&)[0].sub(/^^`'"~/i, ‘’)  
}  
end  
end

require ‘test/unit’  
class TestStripDiacritics \< Test::Unit::TestCase

def test\_upper\_case  
assert\_equal(‘AAAAA’, ‘ÀÁÂÃÄ’.strip\_diacritics)  
assert\_equal(‘EEEE’, ‘ÈÉÊË’.strip\_diacritics)  
assert\_equal(‘IIII’, ‘ÌÍÎÏ’.strip\_diacritics)  
assert\_equal(‘OOOOO’, ‘ÒÓÔÕÖ’.strip\_diacritics)  
assert\_equal(‘UUUU’, ‘ÙÚÛÜ’.strip\_diacritics)  
assert\_equal(‘Y’, ‘Ý’.strip\_diacritics)  
assert\_equal(‘N’, ‘Ñ’.strip\_diacritics)  
end

def test\_lower\_case  
assert\_equal(‘aaaaa’, ‘âãäàá’.strip\_diacritics)  
assert\_equal(‘eeee’, ‘êëèé’.strip\_diacritics)  
assert\_equal(‘iiii’, ‘îïìí’.strip\_diacritics)  
assert\_equal(‘ooooo’, ‘ôõöòó’.strip\_diacritics)  
assert\_equal(‘uuuu’, ‘ûüùú’.strip\_diacritics)  
assert\_equal(‘y’, ‘ý’.strip\_diacritics)  
assert\_equal(‘n’, ‘ñ’.strip\_diacritics)  
end

def test\_words  
assert\_equal(‘Internationalizaetion’,  
‘Iñtërnâtiônàlizætiøn’.strip\_diacritics)  
end

def test\_punctuation  
assert\_equal(‘-’, ‘?’.strip\_diacritics)  
assert\_equal(“‘’”, “‘’”.strip\_diacritics)  
end  
end
