2009年06月06日 15:30 [Edit]

javascript - でも全角半角変換

ぐぐっても、変換コードがありそうでなかったのでついでに。

  • 404 Blog Not Found:perl - で全角半角変換をモダンに行う

  • Demo

    全角
    半角

    実装

    見ての通り、けれんみのないやり方をしています。

    
    (function(){
    
    var zenkaku = ['。', '、', '「', '」', '・', 'ー',
        'ァ', 'ア', 'ィ', 'イ', 'ゥ', 'ウ', 'ェ', 'エ', 'ォ', 'オ', 
        'カ', 'ガ', 'キ', 'ギ', 'ク', 'グ', 'ケ', 'ゲ', 'コ', 'ゴ', 
        'サ', 'ザ', 'シ', 'ジ', 'ス', 'ズ', 'セ', 'ゼ', 'ソ', 'ゾ', 
        'タ', 'ダ', 'チ', 'ヂ', 'ッ', 'ツ', 'ヅ', 'テ', 'デ', 'ト', 'ド', 
        'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 
        'ハ', 'バ', 'パ', 'ヒ', 'ビ', 'ピ', 'フ', 'ブ', 'プ', 'ヘ', 'ベ', 'ペ', 'ホ', 'ボ', 'ポ', 
        'マ', 'ミ', 'ム', 'メ', 'モ', 
        'ャ', 'ヤ', 'ュ', 'ユ', 'ョ', 'ヨ', 
        'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ヲ', 'ン', 'ヴ'
    ];
    
    var hankaku = ['。', '、', '「', '」', '・', 'ー',
        'ァ', 'ア', 'ィ', 'イ', 'ゥ', 'ウ', 'ェ', 'エ', 'ォ', 'オ', 
        'カ', 'ガ', 'キ', 'ギ', 'ク', 'グ', 'ケ', 'ゲ', 'コ', 'ゴ', 
        'サ', 'ザ', 'シ', 'ジ', 'ス', 'ズ', 'セ', 'ゼ', 'ソ', 'ゾ', 
        'タ', 'ダ', 'チ', 'ヂ', 'ッ', 'ツ', 'ヅ', 'テ', 'デ', 'ト', 'ド',
         'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 
         'ハ', 'バ', 'パ', 'ヒ', 'ビ', 'ピ', 'フ', 'ブ', 'プ', 'ヘ', 'ベ', 'ペ', 'ホ', 'ボ', 'ポ', 
         'マ', 'ミ', 'ム', 'メ', 'モ', 
         'ャ', 'ヤ', 'ュ', 'ユ', 'ョ', 'ヨ', 
         'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ヲ', 'ン', 'ヴ'
    ];
    
    var re_zenkaku = new RegExp('[' + zenkaku.join('') +']', 'g');
    var z2h = {}; for (var i = 0, l = zenkaku.length; i < l; i++){
        z2h[zenkaku[i]] = hankaku[i];
    }
    zen2han = function(str){
        return str.replace(re_zenkaku, function(m0){
            return z2h[m0];
        });
    };
    
    var re_hankaku = /[\uFF61-\uFF9D][\uFF9E\uFF9F]?/g;
    var h2z = {}; for (var i = 0, l = hankaku.length; i < l; i++){
        h2z[hankaku[i]] = zenkaku[i];
    };
    han2zen = function(str){
        return str.replace(re_hankaku, function(m0){
            return h2z[m0];
        });
    };
    
    hira2kata = function(str){
        return str.replace(/[\u3041-\u3096]/g, function(m0){
            return String.fromCharCode(m0.charCodeAt(0) + 0x60);
        });
    };
    
    kata2hira = function(str){
        return str.replace(/[\u30A1-\u30F6]/g, function(m0){
            return String.fromCharCode(m0.charCodeAt(0) - 0x60);
        });
    };
    
    })();
    

    JavaScriptの場合、文字コード変換はブラウザーが面倒を見てくれるので、Encode.pmのようなツールの必要性を感じることは少ないのですが、简体字-繁體字変換など、transliterationの需要はむしろ強く感じます。半角カナの場合も、ネット銀行の振込先指定で必要だったりもしますし。つーか、全角で打てるようにしろよいいかげんに>ネット銀行各社

    Enjoy!

    ダンザジャヴァスクリプター

    See Also:


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

    この記事へのトラックバック
    TOEFLに限らず、その他の試験や仕事、日常生活においても重要なポイントというものがあります。 そして、試験を対象にした場合、もっとも重要なポイントとなるのが、『採点基準』であることは明白です。 そのポイントを知っているか知らないかで、同じ実力でも結果...
    TOEFLを攻略するためのポイント【TOEFL攻略大全】at 2009年06月21日 03:02
    この記事へのコメント
    chromeで動いてないっす。。

    Posted by sakurada at 2009年06月06日 16:06
    sakuradaさん、
    例によって円マーク問題です。直しました。
    Dan the JavaScripter
    Posted by at 2009年06月06日 16:12
    >つーか、全角で打てるようにしろよいいかげんに>ネット銀行各社

    各社それぞれの問題ではないのでは?多分、元はといえば全銀ネットの仕様の問題でしょ。振込みでは小さい字(「ッャュョ」)もなかったような気がするし。
    Posted by んが at 2009年06月06日 16:28
    これですかね>Safari+EUC-JP+YEN SIGNな問題
    https://bugs.webkit.org/show_bug.cgi?id=24906

    Chromeには取り込んでもらったんですが、Safariは担当を説得するのに先述転換が必要なことを確認したあたりでいそがしくなってしまいほったらかしに。
    Posted by 成瀬 at 2009年06月06日 17:17
    *とか+とか¥とかの記号類は変換対象外なんですね。
    Posted by U D at 2009年06月06日 18:45
    >元はといえば全銀ネットの仕様の問題でしょ

    んなことはユーザからすれば関係なくて、入力されたデータに応じて適切に変換すればいい。
    Posted by へたれ at 2009年06月07日 00:06
    今も昔もプログラムド素人だけど、
    5年くらい前、JSPの講習の時に、Hello worldの次になんか作れとなって、
    郵便番号から住所をひっぱるサービス作ったんだが、
    素人なりに、全角でも半角でもハイフンが入ってても、
    中で変換して正しく検索されるように頑張って作った。

    確かにネット銀行やらキャンペーン応募サイトやら、
    いずこの業者も、素人でもできることを放置しすぎだな。
    Posted by Webデザイナー at 2009年06月08日 12:31
    蒸し返し恐縮ですが。
    「ア゙」がundefinedではなく「ア゛」に変換されてほしいのは私だけでしょうか…。

    --- zenhan.js 2009-08-13 11:46:15.228295100 +0900
    +++ zenhan.js.new 2009-08-13 11:46:16.306427000 +0900
    @@ -40,7 +40,8 @@
    };
    han2zen = function(str){
    return str.replace(re_hankaku, function(m0){
    - return h2z[m0];
    + return h2z[m0] ? h2z[m0] :
    + h2z[m0.slice(0, 1)] + String.fromCharCode(m0.charCodeAt(1) - 0xCF03);
    });
    };
    Posted by orangeful at 2009年08月13日 11:50