その他
    ホーム 技術発信 DoRuby blank?は意外なサプライズ

    blank?は意外なサプライズ

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    文字列のblank?メソッドは正規表現を使っていますので、UTF-8的に正しいバイト列ですかチェックしています。

    型によって、blank?の処理が違います。

    文字列の場合、正規表現で判断しています。

    配列の場合、Arrayのempty?と同じです。

    ハッシュの場合、Hashのempty?と同じです。

    blank.rbの一部ソースコード:

    class String

    def blank?

    self !~ /[^[:space:]]/

    end

    end

    class Array

    alias_method :blank?, :empty?

    end

    class Hash

    alias_method :blank?, :empty?

    end

    Ruby 1.9 でUTF-8的に正しくないバイト列がある文字列を扱っていると、

    正規表現マッチや gsub といったメソッドを使っているところで ArgumentError: invalid byte sequence in UTF-8 例外が発生します。

    文字列を生成したときではなくて正規表現マッチなんかをしたときに始めてエラーが出るのです。

    例:

    str = “\xC1\xB9\xA4\xB1\xA4\xF3\xA4\xC1\xA4\xF3\xBD\xC1”

    begin

    str.blank?

    rescue => e

    p e # ArgumentError: invalid byte sequence in UTF-8

    end

    文字列のblank?メソッドは正規表現を使っていますので、UTF-8的に正しいバイト列ですかチェックしています。

    配列の要素に対して、正しいUTF8バイト列をチェックするため、要素に対して、blank?を使用します。

    記事を共有