JavaScriptで記号の半角と全角を相互に変換

Pocket

JavaScriptで記号を半角から全角に変換するには英数字と同様にコードを65248(16進で0xFEE0)だけずらせばよいです。これは「JavaScriptで全角英数字を半角に変換」で紹介しました。
例えば「!」のコードは33(0x0020)なので65248ずらすと65281(0xFF01)で「!」となります。
ほとんどの記号がこのパターンです。

しかし一部、あてはまらないものがあります。
「\」は92(0x005C)ですが65248ずらすと65340(0xFF3C)で「\」になります。これは元がバックスラッシュなので日本語だと無理です。「¥」にしたいところです。
また「"」「'」は「"」「'」になってしまいます。「”」「’」にしたいところです。
句読点やカギ括弧など日本語特有の記号についてはまったく合いません。
そこで一つずつ置換する方法を考えました。

function convert_kigo_han_zen(str, option) {
  //option=0:半角から全角, 1:全角から半角
  var pairs, pairs_length, i, before, after;
  if(option !== 0) {
    option = 1;
  }
  pairs = [
    ["\u0020", "\u3000"], // 半角スペース⇔全角スペース
    ["\u0021", "\uFF01"], // !⇔!
    ["\u0022", "\u201D"], // "⇔”
    ["\u0023", "\uFF03"], // #⇔#
    ["\u0024", "\uFF04"], // $⇔$
    ["\u0025", "\uFF05"], // %⇔%
    ["\u0026", "\uFF06"], // &⇔&
    ["\u0027", "\u2019"], // '⇔’
    ["\u0028", "\uFF08"], // (⇔(
    ["\u0029", "\uFF09"], // )⇔)
    ["\u002A", "\uFF0A"], // *⇔*
    ["\u002B", "\uFF0B"], // +⇔+
    ["\u002C", "\uFF0C"], // ,⇔,
    ["\u002D", "\uFF0D"], // -⇔-
    ["\u002E", "\uFF0E"], // .⇔.
    ["\u002F", "\uFF0F"], // /⇔/
    ["\u003A", "\uFF1A"], // :⇔:
    ["\u003B", "\uFF1B"], // ;⇔;
    ["\u003C", "\uFF1C"], // <⇔<
    ["\u003D", "\uFF1D"], // =⇔=
    ["\u003E", "\uFF1E"], // >⇔>
    ["\u003F", "\uFF1F"], // ?⇔?
    ["\u0040", "\uFF20"], // @⇔@
    ["\u005B", "\uFF3B"], // [⇔[
    ["\u005C", "\uFFE5"], // \⇔¥
    ["\u005D", "\uFF3D"], // ]⇔]
    ["\u005E", "\uFF3E"], // ^⇔^
    ["\u005F", "\uFF3F"], // _⇔_
    ["\u0060", "\uFF40"], // `⇔`
    ["\u007B", "\uFF5B"], // {⇔{
    ["\u007C", "\uFF5C"], // |⇔|
    ["\u007D", "\uFF5D"], // }⇔}
    ["\u007E", "\uFF5E"], // ~⇔~
    ["\uFF61", "\u3002"], // 。⇔。
    ["\uFF62", "\u300C"], // 「⇔「
    ["\uFF63", "\u300D"], // 」⇔」
    ["\uFF64", "\u3001"], // 、⇔、
    ["\uFF65", "\u30FB"] // ・⇔・
  ];
  pairs_length = pairs.length;
  for(i = 0; i < pairs_length; i++) {
    before = pairs[i][option];
    after = pairs[i][1 - option];
    while(str != str.replace(before, after)) {
      str = str.replace(before, after);
    }
  }
  return str;
}

引数に文字列とオプションを与えます。オプションが「0」ならば半角を全角に、「1」ならば全角を半角に変換します。
愚直ですが、半角記号と全角記号を対にして並べ、一組ずつ置換します。上述の通り、規則性がない記号があるからです。また、これならば置換したくない記号はコメントアウトできます。
replaceで正規表現を使うと一気に置換できますが、これも愚直に一文字ずつ置換します。正規表現の記号と重複する記号があり、エスケープするのが面倒だからです。

[ 2015年7月7日 | カテゴリー: JavaScript | タグ: , , ]

« | »

コメント

  1. […] 「JavaScriptで記号の半角と全角を相互に変換」という記事を書きました。 そのPHP版です。 半角と全角の記号そのものを並べて置換するという極めて愚直な方法です。 置換したくない記号についてはコメントアウトします。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報