JavaScript 文字列 全角を半角に 半角を全角に変換する方法
さまざまなデータをWebから保存する際、
英数字に関しては、全角か半角か統一して保存したいものです。
まぁ、大体半角にするんですけど。
今回は相互に変換する関数のお話です。
とりあえず皆さん google 先生に相談しますよね。
そして見つかったのが以下の記事。
JavaScriptで全角英数と半角英数の相互変換
http://d.hatena.ne.jp/Rewish/20100427/1272296260
// 半角にしたい str.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) - 0xFEE0); }); // 全角にしたい str.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) + 0xFEE0); });
・全角(半角)英数字を全て置換
・置換関数を指定
・ヒットした文字をUnicode値に変換
・そのコードにオフセットを加算
・再度そのUnicode値を文字列に変換して返す
という工程になっています。
今回は もっと便利になるよう Stringオブジェクトを拡張しましょう。
結局こういったものは、他でも使用する事があるので直接ではなく、関数化などをすべきです。
toUpperCase() などに習い、 toOneByteAlphaNumeric() とでもしましょう。
// 全角英数字文字列を半角文字列に変換する String.prototype.toOneByteAlphaNumeric = function(){ return this.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) - 0xFEE0); }); } // 半角英数字文字列を全角文字列に変換する String.prototype.toTwoByteAlphaNumeric = function(){ return this.replace(/[A-Za-z0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) + 0xFEE0); }); }
拡張ができれば以降は、
var text = "ABC012"; alert( text.toOneByteAlphaNumeric() );
というように関数を呼び出すことで、変換された文字列が返ってきます。
どうせなら、AlphaNumeric ではなく、全ての記号を変換する
String.prototype.toOneByteCharacter()
と定義できればスマートですが、実際の所、使用カ所が思いつきません。
「¥」「#」「<」「>」など、そもそも入力できないように
入力制限を行う場合がほとんどだからです。
入力時に、IMEモードの切り替えや、各種プラグインですでに、
文字列がしぼられた後に、JavaScript関数に来ると思いますし、
そうなってしまえば、わざわざ多機能な関数を呼ぶよりかは、
toAlphaNumeric()のような決め打ちで。
久しぶりに記事を書くと、支離滅裂ですねw
いろいろと起承転結考えてテーマがあったのですが、
それすら忘れてしまいましたw
では、以上です。
標準の関数を使ってstring.normalize(‘NFKC’)とすれば英数字は半角に、カナは全角になります。
情報ありがとうございます。
処理を使用しようとしているブラウザを限定できるのであれば有効ですね。
順次対応していってますが、未対応ブラウザがまだ多くあるため、
標準関数を生で呼び出す事は、まだしばらく先になりそうです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
実装されているブラウザでは、normalizeを使うのもいいかもしれませんが、
デバッグを少なくしたい為、オープンソースを除き、
個人でクロスプラットフォーム対応する場合は、
同じ処理に統一しておいた方が、安全だと考えています。
コメントありがとうございました。