トップ «前の日記(2012-04-03) 最新 次の日記(2012-04-07)» 編集

日々の破片

著作一覧

2012-04-05

_ ユーザ入力の住所は怖い

データベースには、ADDRESSみたいなカラムがあり、そこはvarchar(64)みたいになっているとしよう。

で、これまでは従業員が入力していた(たとえば、客が書いた配送先住所を手打ちで入れていたりとか)とする。

「これまで」というくらいだから、何も考えずにシフトJIS(でもその実体はWindows-31J)にしていたことだろう。

で、なぜかそれをユーザーがWebから直入力できるようにしてしまったとする。

これは、つくづくと相当な死亡フラグなのだが、問題となったという事例を見ない。

不思議だ。他の人たちはどうやっているのだろうか?

ユーザーは、こちらが驚くほど多様だ。

たとえば、「ザ・グレート歌舞伎町」というマンション名があるとする。

「・」を知っている人は「/」を変換するだろう。知らなくても普通はそう入力するような気がする。全然知らなくても「中黒」という用語を知っていれば変換できる。

でも、「ザ◦グレート歌舞伎町」と入力してくる人がいる。(WhiteBullet \u25e6)

あるいは「ザ•グレート歌舞伎町」(Bullet \u2022)も普通にいる。

これらは、最後にはデータベース内に「ザ?グレート歌舞伎町」として格納されて、気づいた人が「なんじゃこりゃ?」と騒ぐことになる。

「-」も鬼門だ。長音「ー」や「-」(全角マイナス)「―」(ダッシュ)「‐」(ハイフン)あたりはなんとなくわかる。「歌舞伎町3‐2‐1」とか書くなら、本来はハイフンのはずだが、これがダッシュやマイナスでもそれほどは困らないし、長音なら置き換えようという気にもなる。

しかし、現実は「―」(Horizontal Bar \u2015)や「‑」(Non-Breaking Hyphen \u2011)「—」(Em Dash \u2014)「⁻」(Superscript Minus \u207b) など、どうやって入力したんだろう? というような文字がたくさんでてきて、気づくと住所は「歌舞伎町3?2?1」になっているわけだ。

対応するにはどうすれば良いのだろうか?

1) データベースの文字コードをUnicodeにする。DM印字とかは多少の字体の違いには目を瞑って入力されたものをそのまま利用する。

これが無難な気がする。

2) WebページをWindows-31Jとして、POSTデータもWindows-31Jでエンコードさせる。

これが成功するかどうかは良くわからない。エコーバックした時点で文字化けしたというユーザークレームを招くだけのような気がするが。

3) 中黒やハイフンに似たすべての文字を洗い出して変換表を作る。

挫折しますた。諸外国の言葉まで含めると中黒やハイフンの代わりに利用できそうな文字はたくさんあり過ぎる。

4) 利用可能な文字コードのセットを使って、文字チェックをする。

しかし、普通のユーザーに「入力された『ザ•グレート歌舞伎町』は利用できない文字が含まれています」って、そんな間違い探しさせるのか? というか、普通に中黒を出せない人だから、そんな妙な入力をしているわけだろうし。

5) 住所入力専用の賢いソフトウェアキーボードウィジェットからしか入力できないようにする

思いっきり不便な気がするのだが。漢字部分だけはキーボードを使わせて?

6) はて困った。

というわけで、みなさんは、どのように対応されているのだろうか?

本日のツッコミ(全8件) [ツッコミを入れる]
_ naruse (2012-04-05 17:41)

> 2) WebページをWindows-31Jとして、POSTデータもWindows-31Jでエンコードさせる。
ブラウザ依存はありますが、送信時点で―とかになります。

まぁ、1が正しいと思います。文字コード変換は evil ですよ。

_ hanadix (2012-04-05 18:00)

プリントアウトしたあとOCRで読み込みしてます嘘

_ ishisaka (2012-04-05 18:01)

幸運なことに住所入力はありませんが、IMEで入力できてしまう以上どうしようもないので、文字列はUNICODEを使うようにしています。JIS2004対応まで考えるとWindowsの場合他にやりようがありません。

_ arton (2012-04-05 19:27)

やっぱり1ですよねぇ。むーん。

_ arton (2012-04-05 19:39)

ブラウザーが実体参照のユニコードを送ってくるってのは勘弁だなぁ。試さなくて良かった。thanks> naruse

_ arton (2012-04-05 23:41)

むむ、住所だけじゃなくて名前も実はまずいことに気付いた。「髙井」さんとか。

_ foa (2012-04-06 10:28)

SJIS Oracleに繋いだRails業務アプリやってますが、DB上は―とかの実体参照形式で保存してます。
each_charで1文字づつUTF8→CP932→UTF8変換して問題があればunpackという。

_ arton (2012-04-06 11:48)

おお、そういう方法も取れますね!参考になります。それだとブラウザが実体参照を送ってくるのと整合性があって良いですね。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え