2008.04.18

ユーザに入力させといて、いちいち全角とか半角とか指定すんなボケ!

巷のオンライン申込フォームやお問い合わせフォームで、住所の番地とか電話番号とか、数字やアルファベットまですべて「全角で入力」とか指定してくるやつがとても失礼。ユーザに入力してくださいと頼んでおいて、内容に関係ない部分までいちいち指定すんな。番地まで全角だとそもそもアホっぽくてかっこ悪いのはもちろん、辞書登録しておいた住所が使えなかったりする。

この中で一番むかつくのは全角指定ボックスに半角打ち込んだときに、チェックしてはじくやつ。
しかも電話番号だけは都合よく半角指定とか。
わざわざチェックするくらいなら勝手に裏で半角から全角にコンバートしてろこのアホ。

どうせ郵便物打ち込むときとかの文字数単位のスペース計算とか、レガシーなシステムにつながってるからとかのサービス側の勝手な都合なんでしょ?それならJavascriptでコンバートしてからURLに入れるのもありやし、サーバサイドでDB格納前にコンバートしてもええやん。印刷時の都合なら印刷直前に変換してもええやないか!

それなら代わりに俺様がJavascriptで全角半角コンバータを作ったる!

というわけで、初心者Javascriptorが2日もかけて、記号を含む英数字(いわゆるASCIIキャラ)を全角←→半角コンバートする関数をつくってみました。こんな簡単なものを実装していないってことは、実装すると困る致命的な理由でもあるのだろうか。(まあいろいろややこしいのですが)

このスクリプトはUnicodeの入出力を前提としています。Javascriptの実装が変な(というか、まだそのあたりの仕様が定まっていなかった?)古いブラウザとか、Javascript 1.4以上?に対応していない環境ではバグが出る場合があります。とくにcharCodeAt()とかString.fromCharCode()のあたりがやばいそうです。なので古いブラウザ用の分岐とかめんどくさそう。(誰か詳しく教えてくれる人希望)

↑Javascriptで実装していないのは、おそらくこれが原因なのだろうと思いました。
たぶん他の言語でもそうなんだろうな。結局しっかりした標準がしっかりと浸透していないと一番困るのはユーザなのだ。

できたやつ

コード

f2h()にstringを引数として指定すると、全角でかつASCIIに入っている文字だけ(Unicodeで0xff01-0xff5e)を半角文字にして結果のstringを返します。h2f()にstringを引数として指定すると、いわゆるASCII文字だけ(Unicodeで0×0021-0x007e)を全角文字にして結果のstringを返します。

半角スペース(Unicode 0×0020)は全角スペース(Unicode 0×3000)に変換されません。
上の例にもある全角の「長音符号/KATAKANA-HIRAGANA PROLONGED SOUND MARK」(Unicode 0x30fc)は半角ハイフン(Unicode 0x002d)には変換されません。半角ハイフンは全角ハイフン/FULLWIDTH HYPHEN-MINUS(Unicode 0xff0d)に、またはその逆に変換されます。

特にMacでは、ヒラギノ角ゴで長音符号とハイフンが同じように見えることもあり、意識して使い分けしない人がほとんどでしょうから、このあたりの事情も実装のめんどくささを増していると言えるでしょう。しかしながら半角→全角なら関係ないことですし、やっぱりユーザの使い勝手なんて考えていない事業者が多いといえます。

2008.04.21
つまんない、しかし致命的な間違いを修正しました。
>→>=、<→<=

2008.04.23
半角-全角の差分0xFEE0を単純に足したり引いたりするようにしました。
が、なんだかうまくいかないので元にもどしました。

function f2h(bs) {;
var ns="";
	for(i=0;i<bs.length;i++) {
		if(bs.charCodeAt(i)>=0xff01&&bs.charCodeAt(i)<=0xff5e)
		ns+=String.fromCharCode(0x0021+(bs.charCodeAt(i)-0xff01));
		else
		ns+=bs.charAt(i);
	}
return ns;
}

function h2f(bs) {;
var ns="";
	for(i=0;i<bs.length;i++) {
		if(bs.charCodeAt(i)>=0x0021&&bs.charCodeAt(i)<=0x007e)
		ns+=String.fromCharCode(0xff01+(bs.charCodeAt(i)-0x0021));
		else
		ns+=bs.charAt(i);
	}
return ns;
}
他のやりかた(ひらがな、カタカナなども含む)

メール送信の際、半角カナを全角に変換するときなどにも役にたつのかな?

  • 全角半角文字の相互変換
    UnicodeベースのJavascript全角半角変換を実現しています。さらに、ループ方式と正規表現での実行速度をブラウザ別に解析していたりと、一読の価値ありです。
  • 半角英数字を全角英数字に変換するjavascript
    正規表現で処理しています。正規表現が何のこっちゃやらわからない私には敷居が高いですが(このページの解説はわかりやすいです)、1バイト文字対応でUnicode前提ならこれが一番短くて対応の幅も広くていいですね。でも残念ながら全角→半角対応ができません。と思いきや正規表現で16進数の文字コードを引っ掛けられるみたいなので対応可能ですね。
  • 半角カナを全角カナに変換する
    変換する文字をArrayに入れて半角カナの濁音に対応しています。半角カナと全角カナは一文字対一文字で対応していないため、このやりかたがいちばん美しく対応できますね。しかもこれはJavascriptのバージョンにも依存しないやり方なので、ASCIIでもなんでもどこでも実装できると思うのだが。
  • 半角カナから全角カナへ変換する(濁点等対応版)
    半角濁点対応として、次の文字をcharAtで判定しています。半角カナ対応は上のやりかたのほうがきれいですね。

Comments (2)

  1. 2008.05.22
    nori said...

    確かにうざいすねあれ
    そもそも全角英数字をやめてほしいです いい加減に

    全角だらけのページうざすぎて危うく閉じるところでした
    うざいボタンとして導入しようか迷います

  2. 2008.06.03
    まんご! said...

    あの全角ボタンはそういう仕様にするつもりではなかったんですが…気に入ってもらえたのであれば幸いです。

Leave a Reply