2

Rubyで文字を7ビットASCIIに音訳する現在の最良の方法は何ですか? 私が SO で見た質問のほとんどは 3 ~ 4 年前のものであり、解決策は完全には機能しません。

さまざまなラテン アルファベットで機能するメソッドが必要で、たとえば、convert

あなたの履歴書は百科事典ではない

あなたの履歴書は百科事典ではない

しかし、特に 8 ビット ASCII を 7 ビット ASCII に折りたたむ方法が見つかりません。

s =  "Your r\u00e9sum\u00e9\u2019s a non\u2013encyclop\u00e6dia"
puts Iconv.iconv('ascii//ignore//translit', 'utf-8', s)
# => Your r'esum'e's a non-encyclopaedia
puts s.encode('ascii//ignore//translit', 'utf-8')
# => Encoding::ConverterNotFoundError: code converter not found (UTF-8 to ascii//ignore//translit)
puts s.encode('ascii', 'utf-8')
# Encoding::UndefinedConversionError: U+00E9 from UTF-8 to US-ASCII
puts s.encode('ascii', 'utf-8', invalid: :replace, undef: :replace)
# Your r?sum??s a non?encyclop?dia
puts I18n.transliterate(s)
# Your resume?s a non?encyclopaedia

は推奨されていないのでIconv、必要がなければ使用したくありませんが、それが機能する唯一のものである場合は使用します。もちろん、カスタムの 8 ビット ASCII から 7 ビット ASCII への変換を行うこともできますが、完全にテストされた、サポートされているソリューションを使用することをお勧めします。

翻訳はInternational Components for Unicodeの Latin-ASCII 翻訳で適切に処理されますが、これは Java と C でのみ利用可能です。

アップデート

私が最終的にやったのは、句読点と空白を処理する独自の文字変換ルーチンを作成することでしI18n.transliterateた。その後、残りの作業を行うことができました。私はまだ、適切に管理されたライブラリ関数を見つけて使用して、I18nそうでないものを処理することを好みます。

4

2 に答える 2

5

多少重い依存関係を追加したい場合 (既に Rails を使用している場合を除く)、ActiveSupport はこれをサポートしています (しゃれは意図していません)。

ActiveSupport::Multibyte::Chars.new("Your r\u00e9sum\u00e9\u2019s not an encyclop\u00e6dia").mb_chars.normalize(:kd).chars.to_a.delete_if {|c| !c.ascii_only?}.join('')

これはすべての文字で機能します。ただし、アポストロフィはまだ正しく処理されません。

于 2013-06-18T04:34:42.937 に答える
1

removeaccentsスクリプトは、まさにあなたが望むものだと思います。

多分UnicodeUtils gemは役に立つかもしれませんが、アクセントを削除するためだけです ( æAFAIK のようなものを変換するためではありません)。

于 2013-09-27T14:01:54.850 に答える