JavaScriptで全角・半角チェックを実装する方法

JavaScriptは内部でUnicodeとして文字列を持ってます。
ので、結局全角(2バイト)半角(1バイト)文字を判別することは不可能です。
それはUnicodeの世界には2バイト文字しかないSI-。
 
でも、仕事上では「やって」と軽く言われるわけでして。。。
どんなに泣き喚いても「やって」ですから。。。
 
そこで無理やり実装してみたいと思います。
半角全角チェックを行うには
Unicode→別の文字コード
への変換を行わなくてはなりません。
 
一般的なセオリーとしては「Windows-31J」じゃないでしょうか。
 
そこで、JavaとかCとか使って「UnicodeWindows-31J」の変換テーブルを
作成するわけです。
 
ちなみにJavaだとこんな感じかな。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class CreateTable {
	public static void main(String[] args) throws IOException {
		int start = 0x0000;
		int end = 0xffff;

		File file = new File("/cp932.txt");
		FileWriter writer = new FileWriter(file);
		for (int i = start; i < end; i++) {
			
			char c1 = (char)i;
			byte[] byts = String.valueOf(c1).getBytes("Windows-31J");
			if(byts.length == 1) {
				writer.write("0x" + Integer.toHexString(i) +
						"\t0x" + Integer.toHexString(byts[0] & 0xff) + "\t#" + c1 + "\n");
			}
			if(byts.length == 2) {
				writer.write("0x" + Integer.toHexString(i) +
						"\t0x" + Integer.toHexString(byts[0] & 0xff) + Integer.toHexString(byts[1] & 0xff)
						+ "\t#" + c1 + "\n" );
			}
		}
		
	}

}

 
これを丸ごとjsに変換テーブルとして変形させてぶち込むわけですな。
ちなみに「0x3f」に関しては文字化けですので、一つにまとめて見ると何百行か減ります。
 
サンプルとしてはこんな感じでしょうか。

  var table = new Object();
  table[0x0] = 0x0;
     .
     .
     .

  function isHankaku(str) {
     for(var i=0,len=str.lenght;i<len;i++) {
        var code = table[str.charCodeAt(i)];
        if(!(code <= 256 || !code)) return false;
     }
     return true;
  }

※まったく動かして無いので、たぶん動きませんw
 
これで、半角チェック。逆にすれば全角のチェックができるという訳です。
めでたし。めでたし。
 
ちなみに、そんなに正確性を求めて無いなら。

is_hanaku : function(str) {
   for (var i = 0; i < str.length; i++) {
      var c = str.charCodeAt(i);
      if ( (c >= 0x0 && c < 0x81) || (c == 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4)) {
        return true;
      }
   }
   return false;
}

でいいんじゃね。