Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > library _builtin > class Encoding::Converter > primitive_convert

instance method Encoding::Converter#primitive_convert

primitive_convert(source_buffer, destination_buffer) -> Symbol
primitive_convert(source_buffer, destination_buffer, destination_byteoffset) -> Symbol
primitive_convert(source_buffer, destination_buffer, destination_byteoffset, destination_bytesize) -> Symbol
primitive_convert(source_buffer, destination_buffer, destination_byteoffset, destination_bytesize, opttions) -> Symbol

エンコーディング変換のためのメソッドの中で、もっとも細かな扱いが可能なメソッドです。

可搬性を確保しつつ、不正なバイトや変換先で未定義な文字の扱いを細かに指定したいときは、Encoding::Converter#primitive_convert が唯一の方法になります。

[PARAM] source_buffer:
変換元文字列のバッファ
[PARAM] destination_buffer:
変換先文字列を格納するバッファ
[PARAM] destination_byteoffset:
変換先バッファでのオフセット
[PARAM] destination_bytesize:
変換先バッファの容量
[PARAM] options:
変換の詳細を指定する定数やハッシュ
[RETURN]
変換結果祖表す Symbol

options には以下が指定できます。

hash form:
  :partial_input => true           # source buffer may be part of larger source
  :after_output => true            # stop conversion after output before input
integer form:
  Encoding::Converter::PARTIAL_INPUT
  Encoding::Converter::AFTER_OUTPUT

戻り値は以下のうちのどれかです。

ec = Encoding::Converter.new("UTF-8", "EUC-JP")
src = "abc\x81あいう\u{20bb7}\xe3"
dst = ''

不正なバイトや変換先で未定義なバイトをエスケープしつつ変換する例です。以上のように、戻り値で分岐させつつ、Encoding::Converter#primitive_errinfo の情報を参照して処理していくことになります。

begin
  ret = ec.primitive_convert(src, dst)
  p [ret, src, dst, ec.primitive_errinfo]
  case ret
  when :invalid_byte_sequence
    ec.insert_output(ec.primitive_errinfo[3].dump[1..-2])
    redo
  when :undefined_conversion
    c = ec.primitive_errinfo[3].dup.force_encoding(ec.primitive_errinfo[1])
    ec.insert_output('\x{%X:%s}' % [c.ord, c.encoding])
    redo
  when :incomplete_input
    ec.insert_output(ec.primitive_errinfo[3].dump[1..-2])
  hen :finished
  end
  break
end while nil