事象
iOS11以上での話。
とあるアプリの開発中、iphone電話帳からコピーした電話番号を、アプリの電話番号入力フォームにペーストして確認画面に遷移しようとすると、なぜかバリデーションエラーが発生する。
特に電話番号におかしな点はないのだが...
調査
色々見てるとどうもlengthチェックで引っかかっていた。
どういうことかというと、
・普通に入力:xx-xxxx-xxxx → ハイフンをとって10文字
・電話帳コピー:xx-xxxx-xxxx → ハイフンをとって12文字
なんか電話帳コピーの場合だけ2文字多い!?
これはconsole.logやalert表示では、パッと見で違いが分からない!
そこでencodeして1つづつ表示してみると、電話番号先頭に「¥u202d」、末尾に「¥u202c」という文字がくっ付いていた事が判明。
hoge.js
for(var i=0; i<tel.length; i++) {
alert(escape(tel)); // %u202dXX-XXXX-XXXX%u202c
}
なんだこれ?と思い調べてみると、文字の方向を制御するunicodeらしい。
参考:http://www.tohoho-web.com/html/attr/dir.htm
解決
サーバー側にもlengthバリデーションがあり、jsと同じくそこで引っかかっていたので、該当オブジェクトのインスタンスの制御文字込み電話番号から、制御文字を削除しました。
hoge_contoller.rb
tel_str.gsub!(/\u202D|\u202C/, "\u202D":"", "\u202C":"")