文字列のnバイト目がShift_JIS(CP932)のマルチバイト文字の後続バイトか調べる
Shift_JISのマルチバイト文字後続バイトの範囲内の str[index] がマルチバイト文字の後続バイトかを調べる。
- index が 0 なら false を返す
- str[index-1] がマルチバイト文字先行バイトの範囲内でなければ false を返す
- str[index-1] がマルチバイト文字後続バイトの範囲内でなければ true を返す
- 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