全角ハイフンとの戦い

恐らく --no-locale オプションをつけ忘れたせいで PostgreSQL でどうしても全角ハイフンがうまく扱えなかったので、かっとなって変換モジュールを書いてみました。対象となる文字を、別の文字へ変更します。なお、文字コードUTF-8 を使う前提で記述しています。

#coding:utf-8
module ConvertChar
  require 'uri'

  def convert(str, before, after)
    str = URI.encode(str)
    buf = ""
    # 全角の文字列を探して、3バイト毎に文字列を分割
    while index = (str =~ /((?:\%[A-F0-9][A-F0-9]){3})/)
      substr = $1
      # 半角の文字が挟まる場合、そのままバッファに追加
      if 0 < index
        buf << str[0, index]
      end
      # ここで文字を変換してバッファに追加
      buf << URI.decode(substr.gsub(URI.encode(before), after))
      # 元の文字列から追加が終わった部分を削除
      new_index = index + substr.length
      str = str[new_index, str.length - new_index]
    end
    # buf が空の時は何もする必要がない
    return buf.length > 0 ? buf : str
  end
end

マジックコメントはつけてますが、動作確認は Ruby 1.8.7 で行いました。多分平気だと思うけど、バグってたら報告ください。多分直します。

参考

文字コード対応表は以下のアドレスにあるので大丈夫だ、問題ない。

http://orange-factory.com/dnf/utf-8.html