<U+200B>(幅なしスペース)というやつに悩まされた話

RailsでデータをDBに入れる際に、電話番号のフォーマットをとりあえずなんでもOKにしていたら、半角や全角や括弧やハイフンやスペースが入り混じったデータ群になってきたので、あんまり見た目がよくないので整形するrake taskを作って、整形後に、どうせなら検証条件も作ってしまおうと思って作った次第。

その後、他のデータの更新を行ったところ…。
失敗するじゃありませんか!しかも電話番号のフォーマットが不正だと言われる始末!

user = User.find 1 # 失敗したレコードのIDを指定
user.tel # => "00-0000-0000"
user.valid? # => false
user.tel = "00-0000-0000"
user.valid? # => true

はぁ???

理解できない…。

他にもあるかと思い、とりあえず抽出する。

invalid_users = []
User.find_each do |user|
  invalid_users << user unless user.valid?
end
invalid_users.count # => 1

どうも1件だけだった模様。

pry(main)>invalid_users.first
=> #<User:0x007fd8fb7188e8
id: 1,
tel: "0<U+200B>0<U+200B>-<U+200B>0<U+200B>0<U+200B>0<U+200B>0<U+200B>-<U+200B>0<U+200B>0<U+200B>0<U+200B>0"
>

ファッ!?なんだ、この<U+200B>って!!

ググったら、Yahoo!知恵袋がヒットした。どうも幅なしスペースというものらしい。幅がないので、見た目にはわからないわけです。単に、user.telだと文字列が表示されるだけだったので、見えなかったのです。

削除する方法は、正規表現でヒットさせるしかないんだろうなぁと思って調べていたら、qiitaにありました。(PHPの記事だったけど、やることは同じ)

qiita: 空白を削除する

とりあえず幅なしスペースを削除して更新したかったので、以下を流すrake taskを作って終わり。

User.find_each do |user|
  user.tel = user.tel.gsub(/[\xe2\x80\x8b]+/, '')
  user.save!
end

タグ Ruby, Ruby on Rails | パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です