文字列のnバイト目がShift_JIS(CP932)のマルチバイト文字の後続バイトか調べる

Shift_JISのマルチバイト文字後続バイトの範囲内の str[index] がマルチバイト文字の後続バイトかを調べる。

  1. index が 0 なら false を返す
  2. str[index-1] がマルチバイト文字先行バイトの範囲内でなければ false を返す
  3. str[index-1] がマルチバイト文字後続バイトの範囲内でなければ true を返す
  4. str[index-1] がマルチバイト文字後続バイトだったら false を返し、 そうでなければ true を返す

マルチバイト文字先行バイトの範囲内であれば、かならずマルチバイト文字後続バイトの範囲内なので 3 は省略できます。

def sjis_second_byte?(str, index, beg=0)
  return false if index == beg
  c = str[index-1]
  return false unless 0x81 <= c and c <= 0x9F or 0xE0 <= c and c <= 0xFC
  ! sjis_second_byte?(str, index - 1, beg)
end

再帰をループに変換。

def sjis_second_byte?(str, index, beg=0)
  result = false
  while true
    break if index == beg
    c = str[index-1]
    break unless 0x81 <= c and c <= 0x9F or 0xE0 <= c and c <= 0xFC
    index -= 1
    result = ! result
  end
  result
end