全角⇔半角の変換


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

この記事のもくじ

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

前の記事

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

次の記事

2021-06-01
PPOP

最近の記事

2021-06-01
Base54
2020-12-22
年月日から曜日を求める数式
2020-05-04
UTF-8 文字(列)と UNICODE の変換
2020-06-07
存在不明のパス名からディレクトリを構築する
2020-05-04
エスケープ文字変換/復元
新着情報

新着情報 Recent docs.

Sorry, but almost these pages are only Japanese.
[TAB] キーの使い方 «What functions does [TAB] key have.»
様々な「切り替え機能」のほか,ワープロで同じ行に「左寄せと右寄せ」を混在させる方法など。
PPOP «Password encrypted file is sent and the Password is notified Otherway Protocol.»
一般的な暗号化ファイルのパスワードを安全に伝える方法。
「マイナンバー」が危険なこれだけの理由 «The reasons of "My-Number System" is danger.»
それでも「マイナンバー」を推す裏の理由を推察。
デジタル化なら「スタイル編集」すべき «Let's "Style-Editting" with word-processor application.»
ワープロで「書式設定」の代わりに「スタイル編集」することで使える様々な便利機能。

人気記事 Frequent view pages.

表計算で「令和」に対応する方法
How to adapt the Gengo era "Reiwa" on spreadsheet applicaiton.

古いアプリも OK。「表計算 令和」の検索結果上位御礼!
表計算ソフトで予定表を自動作成する超便利な方法 «How to make the schedule table automatically on spread-sheet.»
「毎月第○×曜日」的な法則は自動で作らせてラクしよう!
表計算ソフトに「個人情報保護機能」を仕込む方法 «Prevention to leak private-data with spread-​sheet macro function.»
「漏えい」のためのフェイルセーフ。「表計算 個人情報」の検索結果上位御礼!
Wary-Basher (ワリバッシャー)
DIY device that enables the handicapped to operate many things with a switch like push-button.

障害者の様々な操作をスイッチ操作で実現する器具。キットも発売中! 「作り方」PDF ダウンロード多数御礼!←地方教育委で人気。
NTT 東日本代理店の勧誘のあり方に対する疑問 «I feeled pretty doubt the solicitation of "Optical-fiber communication" from the agency of NTT-east corporation.»
「あえて」分かりにくい説明をする業者に儲けさせてはいないか?
貧乏人を殺す行政の構造 «Structurally, the administrators kill the poors in Japan.»
ヘタすると多摩川に流されるところだった台風 19 号

この記事に対する → 調布市の反応

おすすめ! Recommend

「事故防シート」について «Cared persons taking with "Jiko-​Bow-​Sheet" prevents from accidents.»
介護現場の負担軽減と事故防止のアイデア
【連載】 キーボードの「キー」の詳しい使い方 «The detial of usage each key on keybord.»
各キーの機能詳細。機能別五十音順一覧。
和易ゐ記 (WAI-WIKI) «WAI-WIKI is light­weight markup language for Japanese, and generates HTML on this server on-​demand.»
当サイトで開発/使用中の日本語向けに特化した軽量マークアップ言語

ご連絡 For contact safely.

当サイト管理者(石川)への連絡内容の機密保持には,こちらで取得できるパスワードをご利用ください。 Get password for file(s) encryption to send the admini­strator of this site M.Ishikawa.

ご支援 Support this site.

この活動をご支援いただける方はこちらへ Could you support this site, see here (but Japanese).

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

 特に 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 2021.