全角⇔半角の変換


公開 (UL): 2021-03-04
更新 (UD): 2021-03-13
閲覧 (DL): 2026-04-14

この記事のもくじ

→本文へ
当サイトは SNS の公式アカウントがないので,「議論ネタ」にする際は,皆さんのブログ,メーリングリスト,SNS や掲示板などで,適当にハッシュタグを付けたりリンクを掲載するなどしてご利用ください。

前の記事

2021-02-23
五十音の「辞書順」の処理

次の記事

2021-06-01
PPOP

最近の記事

2024-02-11
XMPP - 長く使える安心チャット
2023-01-16
Android のキーボード・ショートカット一覧
2023-09-15
Perl の正規表現での A と Z の扱い
2022-08-09
代表的な画像ファイル形式一覧
2022-04-04
サイトのローカル試験と実ウェブ上の差を縮める手法(Perl)
新着情報
She appears also the top page.

新着情報 Recent docs.

Sorry, but most of these pages are only Japanese.
現場で活きる「電子工作」 «Get starting electronics handmaking!»
政権政党圧勝により介護福祉制度の改悪は必至! 現場の自助・自衛のための機器「手作り」入門!

人気記事 Frequent view pages.

おすすめ! Recommend

ご連絡 Contact

▼ メールフォームはこちら
SSL 証明書の更新に不具合が多いため,期限切れエラーが出た際は,お手数ですが「例外指定」をお願いいたします。

ファイルの暗号化
当サイト管理者(石川)宛にメール添付で送信するファイルを暗号化したい時は,唯一のパスワードを PPOP で取得できます。 PPOP gives a password for encryption of the file(s) attached your mail to the admini­strator of this site M.Ishikawa.
PPOP

MEMO / Email to the Author
あとで調べたい点のメモなどに利用可能。
下部ボタンでそのまま著者にメールできます。


CAPTCHA: easy math prob in Japanese

時事川柳 News Senryu

颯爽と  
アソー出てきて
  轍を踏む
Aso will finish the government of LDP also this time.

以前もこの方が(げや→)下野に導いたんでしょって。

(⌚2025-10-12)

ご支援 Support this site.

まだまだ コロナ失業中!!
CORONA-NEET, seeking works now!

この活動をご支援いただける方はこちらへ Could you support this site, see here (but Japanese).
都道府県庁さん, 地方自治体さんや教育委員会さん, 障害者就労支援機関さんやその他公的機関,省官庁さん, 「タダ見」しているだけでは, 格差が広がるだけだと思いませんか?
Welcome!
Alibaba    Google
The companies, thanks for many accesses every months! Are the articles I wrote helping for increasing your income? Although, I cannot get even a penny and jobs from that.

 時々この機能が欲しくなる。特に「全角→半角」の方向。
 ワリと大きな企業サイトのフォームでも「半角で入力してください」などと注文がつけられている項目があり,それに気づかず全角で入力してしまうと受け付けてくれなかったりする。しかし,「かな」を考えなければ,全角を半角にするのはそんなにむずかしくないのではないか。自動で変換する機能くらい付けてくれりゃいいのにと思う。大企業でもそこまで考慮してコード書ける人がいないのか,あるいはやはりコードはどこかに「丸投げ」して,「文字コード」というものをよく知らない人がフォーム作ったりしているということなのか……。

 特に Perl の正規表現置換によって簡単に実現すると分かったので,メモついでに書いておく。

● Perl

 Perl には UNICODE の「内部表現」機能があるが,それを使うと負担が大きそうな気がする。ファイルなどでは UTF-8 を直接扱えたほうがラクな気もするし。というわけで,ここでは UTF-8 前提で考える。

◆ 全角→半角

 UTF-8 で,スペースとかなを考慮しなくてもいいなら,正規表現置換一文で書ける。既定変数 $_ を対象にするなら,これでいい。

▼ 全角→半角(スペース,かな除く)
   # UTF-8 全角 → 半角 by M.Ishikawa(スペース,かな除く)
   s/\xEF(\xBC[\x81-\xBF]|\xBD[\x80-\x9E])/chr((ord(substr($1,0,1))& 1)*64+(ord(substr($1,1,1))&0x3F)+32)/eg;

● JavaScript

 JavaScript の内部表現は UNICODE そのものだから,文字単位で考えればいい。

◆ 全角→半角

 String オブジェクトにはいちおう replace() というメソッドが用意されているが,全置換するには正規表現を使う必要がある。また,筆者が使っている FireFox 45 では,replaceAll() というメソッドは使えず,結局 replace() の正規表現に全置換オプション(g)を付けて対応する必要が出てくる。いずれにせよ,正規表現未対応の古いブラウザでは使えない。もし正規表現が使える場合は,String オブジェクトにメソッドを追加して使うとしたらこんな感じ。“*1”というのは,十進数 parseInt() の省略形。直後の“+2”を数値として加算するため。

▼ 全角→半角(スペース,かな除く簡易型)
   String.prototype.ztoh = function(){ // 全角 → 半角
   return unescape( escape( this ).
	  replace( /%uFF([0-5])/ig, '%u00'+('$1'* 1 + 2) ) );
   }

 しかしこれ,筆者の使う FireFox 45 ではうまくいかない。“$1”が単なる文字列,あるいは裸だと未定義となってしまう。JavaScript の正規表現の実装は,わりと中途半端のようだ。
 ただ,数字に限るなら,これでいいのかもしれない。

▼ 全角→半角(数字限定簡易型)
   String.prototype.ztoh = function(){ // 全角 → 半角
   return unescape( escape( this ).replace(/%uFF1/ig,'%u003') );
   }

 正規表現を使わない場合は,こんな感じか。たぶんこのほうが確実。

▼ 全角→半角(スペース,かな除く)
   String.prototype.ztoh = function(){ // 全角 → 半角
   var	i, c, res =''; // by M.Ishikawa(スペース,かな除く)
	for( i=0; i < this.length; i++ ) res +=
	  ( '\uFF01'<=( c = this.charAt( i ) )&& c <'\uFF5F' )
	  ? unescape( '%'+(escape( c ).substr( -2, 1 )*1+2)+
			   escape( c ).substr( -1, 1 ) ): c;
	return res;
   }

 フォームで,たとえば郵便番号(zipcode)の項目の記載内容にある全角文字を半角にしたい時はこんな感じになる。

▼ 全角→半角(スペース,かな除く)
	var  elemobj = document.forms[0].elements.zipcode;
	elemobj.value = elemobj.value.ztoh();


© M.Ishikawa; TREEWARE 2026.