web-dev-qa-db-ja.com

任意のエンコーディングから文字列をUTF-8に強制します

私のRailsアプリでは、世界中のRSSフィードを使用していますが、一部のフィードにはUTF-8以外のリンクがあります。元のフィードリンクは制御できません。アプリの他の部分でそれらを使用するには、UTF-8である必要があります。

エンコードを検出してUTF-8に変換するにはどうすればよいですか?

35
Hayk Saakian

Ruby 1.9

エンコーディングの「強制」は簡単ですが、エンコーディングを変更するだけでは文字は変換されません。

str = str.force_encoding("UTF-8")

str.encoding.name # => 'UTF-8'

変換を実行する場合は、encodeを使用します。

begin
  str.encode("UTF-8")
rescue Encoding::UndefinedConversionError
  # ...
end

詳細については、次の投稿を必ずお読みください。
http://graysoftinc.com/character-encodings/Ruby-19s-string

56
kwarrick

これにより、正しいエンコーディングが確保され、無効または未定義の文字が空白文字列に置き換えられるため、エラーが発生しなくなります。

これにより、有効なUTF-8文字列があることが確実になります

str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''})
28
John Pollard

Iconv

require 'iconv'
i = Iconv.new('UTF-8','LATIN1')
a_with_hat = i.iconv("\xc2")

要約:iconv gemは、エンコードの変換のすべての作業を行います。次のものでインストールされていることを確認してください。

gem install iconv

現在、文字列が現在どのエンコーディングにあるかを知る必要がありますRuby 1.8は文字列をバイトの配列として扱います(組み込みエンコーディングなし))たとえば、文字列がlatin1にあり、 utf-8に変換したかった

require 'iconv'

string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding)
4
Dipak Panchal