2013-11-26 3 views
1

루비를 음역, 미래에 더 이상 사용되지 않습니다,하지만 난의 iconv가iconv에서 1.9.3가의 iconv 중단에 대해 경고하고

Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště') 

반환 Teziste에서 일반 ASCII를 가지고 분음 부호를 제거하기 위해 사용합니다. String.encode을 사용하면 어떻게 얻을 수 있습니까? 나는 레일 (또는 ActiveSupport)의 주위에 있던 경우에

+0

예상되는 출력과 입력은 무엇입니까? –

+0

''ascii // translit''이 아니 었습니까? – sawa

+0

@ArupRakshit :''Těžiště ''가 분명히 입력이고''Teziste''가 예상 결과라고 생각하십시오. –

답변

3

, 나는 이런 식으로 뭔가를 할 거라고 :

ActiveSupport::Multibyte::Unicode.normalize('Těžiště', :kd).chars.grep(/\p{^Mn}/).join('') 

'Teziste'를 얻을 수 있습니다. :kd 본질적으로 decomposes 악센트 부호가있는 문자를 별도의 악센트 및 문자로 매핑 한 다음 \p{^Mn}은 문자 스트림에서 모든 비 공백을 제거하고 모두 join과 함께 다시 넣으면 악센트없는 문자열이 반환됩니다.

당신은 레일이 없거나 ActiveSupport 편리합니다, 당신은 unicode-utils 대신 ActiveSupport::Multibyte::Unicode.normalize에서 UnicodeUtils.compatibility_decomposition를 사용할 수있는 경우 :

: 나는 레일 - 땅에서 String에 패치 (patch) ActiveSupport 버전을 사용하는 경향이

> UnicodeUtils.compatibility_decomposition('Těžiště').chars.grep(/\p{^Mn}/).join('') 
=> "Teziste" 

def de_accent 
    # 
    # `\p{Mn}` is also known as `\p{Nonspacing_Mark}` but only the short 
    # and cryptic form is documented. 
    # 
    ActiveSupport::Multibyte::Unicode.normalize(self, :kd).chars.grep(/\p{^Mn}/).join('') 
end 

내가 좋아하는 것을 말할 수 있도록 :

> s = 'Těžiště'.de_accent 
=> "Teziste" 
을3210

악센트를 제거하십시오.

이 접근 방식은 모든 것을 처리하지는 않지만 충분할 수 있습니다.

+1

아주 가깝습니다. 그러나 ...''Groß'.de_accent => 'Groß''' (iconv와 같은''Gross''가 아니라) – vitas

+0

@vitas : 문제는'ß'는 로케일 종속적입니다.'SS '는 지역에 따라 다릅니다. 이것은 악명 높은 터키인들과는 아무 상관이 없습니다. 유니 코드 -IUTS를 사냥해서 거기에 필요한 것이 무엇이 있는지 알아보기를 권합니다. –