2009-02-06 14 views
10

Istnieje już bardzo similar question. Jednym z rozwiązań wykorzystuje kod jak ten:Usuwanie akcentów/znaków diakrytycznych z ciągu znaków przy zachowaniu innych znaków specjalnych (wypróbowano mb_chars.normalize i iconv)

string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s 

który działa cuda, dopóki nie zauważy, że także usuwa spacje, kropki, kreski i kto wie co jeszcze.

Nie mam pewności, jak działa pierwszy kod, ale czy można go usunąć tylko pod kątem ? A może przynajmniej dostaniesz listę znaków do zachowania? Moja znajomość wyrażeń regularnych jest mały, ale próbowałem (bezskutecznie):

/[^\-x00-\x7F]/n # So it would leave the dash alone 

mam zamiar zrobić coś takiego:

string.mb_chars.normalize(:kd).gsub('-', '__DASH__').gsub 
    (/[^x00-\x7F]/n, '').gsub('__DASH__', '-').to_s 

okropna? Tak ...

Próbowałem również:

iconv = Iconv.new('UTF-8', 'US-ASCII//TRANSLIT') # Also tried ISO-8859-1 
iconv.iconv 'Café' # Throws an error: Iconv::IllegalSequence: "é" 

pomoc proszę?

Odpowiedz

11

usuwa również spacje, kropki, myślniki i kto wie co jeszcze.

Nie należy.

string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s 

Pomyliliście się, powinien pojawić się ukośnik odwrotny przed x00, aby odnieść się do znaku NUL.

/[^\-x00-\x7F]/n # So it would leave the dash alone 

pan umieścić „-” pomiędzy „\” i „x”, który złamie odniesienie do znaku null, a tym samym przełamać zakres.

+0

Och, drogi panie ... proszę, wybacz mi :) Dzięki! – Ivan

+0

Tak, wszyscy mieliśmy nużący ciężar debugowania zamieszania spowodowanego przez najprostsze literówki! – bobince

+1

Co ze spacjami? nie zachowuje białych przestrzeni. –