2008年01月14日 03:30 [Edit]

regexp - 全角英数字を半角に

きっかけは、はてなハイク。

自分と根本的にあわない人 - fmht7 - はてなハイク
PCで英数字をダブルバイトで入力する人

禿同、しかし人を憎みたくなかったので。


Perlではお茶の子さいさい。

perl - dankogai - はてなハイク
perl -CIO -ple 'tr/\x{FF01}-\x{FF5e}/\x21-\x7e/'

は脊髄でひねり出せた。

どうせならJavaScriptでもやってみよう、ということでひねり出したのがこちら。

var fascii2ascii = (function(){
  var cclass
   = '['+String.fromCharCode(0xff01)+'-'+String.fromCharCode(0xff5e)+']';
  var re_fullwidth = new RegExp(cclass, 'g');
  var substitution = function(m){
    return String.fromCharCode(m.charCodeAt(0) - 0xfee0); // 0xff00 - 0x20
  };
  return function(s){ return s.replace(re_fullwidth, substitution) };
})();

これで、

でid:ululunお嘆きの

はてなブックマーク - 煩悩ブックマーク / 2007年12月11日
URIが半角で書かれているだけマシ

も大丈夫。すでにlinkthemall.jsの方はこれを含んだ形にupdateしました。新聞社のサイトなど、全角がうざいところで使うとぐーでしょう(特にasahi.comとか)。

Enjoy!

Dan the Regular Expressionist

追記: 以下を受けて少し書き換え。

JavaScriptには\uXXXXがあるんですよ[文系大学的IT系の悲哀]
置換に使う関数オブジェクトもあらかじめ初期化しておかなければ効果は半減です。

この記事へのトラックバックURL

この記事へのトラックバック
dankogaiさんはあまりJavaScriptのリテラルに詳しくないのかな? 404 Blog Not Found:regexp - 全角英数字を半角に var fascii2ascii = (function(){ var cclass = '['+S...
JavaScriptには\uXXXXがあるんですよ【文系大学的IT系の悲哀】at 2008年01月14日 12:13
この記事へのコメント
WEBアプリを作成して、下記のコンテストへ参加している者です。
http://ewi.sourceforge.jp/vm4s.html

はてなブックマーク - お知らせ 第2回 チームラボアルゴリズムコンテスト
http://b.hatena.ne.jp/entry/http://www.team-lab.com/news/index.php?itemid=469

このブログの記事にあった、全角英数字を半角に変換するjsのロジックを
元に作成したjs[ascii2fascii](半角→全角)を組み込んでいます。
半角記号をそのまま形態素解析のAPIへパラメータに渡すと
名詞として解析されてしまうためです。

ところが、["], ['], [\] については
想定していた「”」、「’」、「¥」にならずに
「」、「」、「\」となってしまうので
別の処理で先に全角に処理しています。

全角の文字コード = 半角のコード番号+0xfee0
という関係がこれらについてはあてはまらないようですね。
(UTF-8だからでしょうか?)

Posted by uniqorn at 2009年03月10日 17:34
すでにlinkthemall.jsの方はこれを含んだ形にupdateしました
Posted by esuli at 2008年01月15日 07:28
変換キーではダメなのですか?
Posted by ノトフ at 2008年01月15日 00:57
Perlの「\x{FF01}」に対応する記法はJavaScriptにも「\uff01」という形で存在します(古いブラウザだと非対応かもしれないけど)。

function fascii2ascii(s){
return s.replace(/[\uff01-\uff5e]/g, function(m){
return String.fromCharCode(m.charCodeAt(0) - 0xfee0); // 0xff00 - 0x20
});
}
Posted by Yuichirou at 2008年01月14日 12:02
秀丸使えばいいんじゃね。
Posted by YU at 2008年01月14日 11:20
〜 の扱いに疑問を感じざるを得ない。 ~の意味で〜を使う人は多いのだろうか。
Posted by tateisu at 2008年01月14日 11:02