3

Ruby String の互換性のあるエンコーディングのリストを取得するにはどうすればよいですか? (MRI 1.9.3)

ユースケース: UTF-8 でエンコードされたユーザー提供の文字列がいくつかあります。理想的にはそれらをISO/IEC 8859-1(8 ビット) に変換する必要がありますが、一部の特殊文字が存在する場合は Unicode にフォールバックする必要もあります。

また、これを達成するためのより良い方法はありますか? 多分私は間違ったことをテストしています。


編集-詳細を追加
する答えのタンク、おそらくいくつかのコンテキストを追加する必要があります。エンコーディング変換を実行する方法を知っています。
文字列を別のエンコーディングに安全にエンコードできるかどうか、または別の(そしてまったく間違った)方法で言えば、その文字列内のすべての文字をサポートするため の最小エンコーディングは何かをすばやく調べる方法を探しています。

文字列を 16 バイトに変換するだけでは解決できません。文字列は SMS として送信され、16 バイトのエンコーディングに変換すると、使用可能な文字数が 160 から 70 に減少するためです。

でサポートされていない特殊文字が含まれている場合にのみ、それらを 16 バイトに変換する必要がありますISO/IEC 8859-1

4

5 に答える 5

4

残念ながら、エンコーディングの互換性に関する Ruby の考え方は、ユース ケースと完全には一致しません。ただし、ISO-8859-1 で UTF-8 文字列をエンコードしようとして、変換が不可能な場合にスローされるエラーをキャッチすると、次のようになります。

begin
  'your UTF-8 string'.encode!('ISO-8859-1')
rescue Encoding::UndefinedConversionError
end

可能な場合は文字列を ISO-8859-1 に変換し、そうでない場合は UTF-8 のままにします。

これはencode、 を使用して実際に文字列をトランスコードする (つまり、文字列の文字表現にEncoding::Converter正しいエンコーディング バイト パターンを再割り当てする)使用することに注意してください。 )。force_encoding

于 2013-01-15T22:29:57.117 に答える
2

Ruby には、クラスEncodingとそのサブクラスEncoding::Convertを見つけることができる標準ライブラリがあり、この場合、おそらくあなたの親友です。

#!/usr/bin/env ruby
# encoding: utf-8

converter = Encoding::Converter.new("UTF-8", "ISO-8859-1")
converted = converter.convert("é")

puts converted.encoding
# => ISO-8859-1

puts converted.dump
# => "\xE9"
于 2013-01-15T12:28:22.957 に答える
2

valid_encoding?( String のインスタンスメソッド) は役に立ちますか? あれは:

try_str = str.force_encoding("ISO/IEC 8859-1")
str = try_str if try_str.valid_encoding?
于 2013-01-15T23:39:13.963 に答える
-1

に変換するにISO-8859-1は、以下のコードに従ってエンコードします。

1.9.3p194 :002 > puts "é".force_encoding("ISO-8859-1").encode("UTF-8")
é
 => nil 

リンクされた回答

于 2013-01-15T12:20:34.747 に答える
-1
"Some String".force_encoding("ISO/IEC 8859-1")

また、レールエンコーディングリンクを参照することもできます

于 2013-01-15T12:22:07.307 に答える