2009-11-13 28 views
10

ルビの英語以外の文字の音訳のための最も簡単な方法は何ですか?ルビの字幕

translit "Gévry"
#=> "Gevry"

+0

これは私の以前の質問と全く同じようです:http://stackoverflow.com/questions/225471/how-do-i-replace-accented-latin-characters-in-ruby –

答えて

10

Rubyは

+1

ええ.. Iconv .iconv( 'ascii // ignore // translit'、 'utf-8'、string).to_sはその仕事をします。 – Selva

+1

私はOPの例でこれを試したところ、 "Gevry"ではなく "Gvry"を返しました。 – jrdioko

+2

@jrdioko 'Iconv.iconv( 'ascii // translit // ignore'、 'utf-8'、string)' – steenslag

3

からthis scriptでご覧になることをお試しください通常iconvコマンドに非常に似た方法でエンコーディングを変換し、そのSTDLIBでIconvライブラリがあります。それは、変換などですTechniConseilsは、文字列内のアクセント付き文字を置き換えます。使用例:

"Gévry".removeaccents #=> Gevry 
+0

少なくとも私にとってUTF-8文字列では動作しません。 – lzap

6

UnicodeUtilsに宝石を使用してください。これは1.9と2.0で動作します。これらのリリースでは、Iconvは推奨されなくなりました。

gem install unicode_utils 

次にIRBでこれを試してみてください。今すぐ

2.0.0p0 :001 > require 'unicode_utils' #=> true 
2.0.0p0 :002 > r = "Résumé"    #=> "Résumé" 
2.0.0p0 :003 > r.encoding    #=> #<Encoding:UTF-8> 
2.0.0p0 :004 > UnicodeUtils.nfkd(r).gsub(/(\p{Letter})\p{Mark}+/,'\\1') 
             #=> "Resume" 

これがどのように機能するかの説明を!

まず、文字列をNFKD(正規化フォーム(K)の可解性分解)形式で正規化する必要があります。 "latin small letter e with acute" として知られている "E" のUnicodeコードポイントは、2つの方法で表すことができる。

  • E = U + 00E9
  • E =(E = U + 0065)+(急性= U + 0301 )

最初のフォームが1つのコードポイントとして最も普及しています。 2番目の形式は分解された書式で、2つの基本コードポイント、ASCII "e"と鋭いアクセント記号に書記素(画面上で "é"と表示されるもの)を分離します。 Unicodeは多くのコードポイントから書記を作成することができ、アジアの書記体系によっては有用です。

通常、比較、ソートなどのためにデータを標準形式で正規化したいと考えています。ここでは、éの2つの形式はNOT equal()です。 IRBでは、次の操作を行います。

> "\u00e9"     #=> "é" 
> "\u0065\u0301"    #=> "é" 
> "\u00e9" == "\u0065\u0301" #=> false 
> "\u00e9" > "\u0065\u0301" #=> true 
> "\u00e9" >= "f"   #=> true (composed é > f) 
> "\u0065\u0301" > "f"  #=> false (decomposed é < f) 

> "Résumé".chars.count  #=> 6 
> decomposed = UnicodeUtils.nfkd("Résumé") 
          #=> "Résumé" 
> decomposed.chars.count  #=> 8 
> decomposed.length   #=> 6 
> decomposed.gsub(/(\p{Letter})\p{Mark}+/,'\\1') 
          #=> "Resume" 

を今、私たちはNFKD形式の文字列を持っていることを、私たちは1続く文字と一致するように、「プロパティ名」構文(\ pを{PROPERTY_NAMEを})を使用して、正規表現を適用することができますまたはそれ以上の発音区別符のマーク。一致する文字をキャプチャすることで、gsubを使用して、文字+発音区別記号を文字列全体のキャプチャされた文字で置き換えることができます。

このテクニックは、ASCII文字から分音記号を削除し、ギリシャ文字列やキリル文字列などの文字セットを同等のASCII文字に変換しません。

+0

+1文字のアクセントを分けて、それを取り除く独創的な方法です。 -1を 'i'として正規化しないため-1 – nurettin

関連する問題