Jqueryで全角文字を半角に変換する

webシステムでは全角文字を半角に変換することはよくあります。
フォームの郵便番号入力など、半角数字前提の入力欄に全角が入力された場合、自動で半角に変換するなどです。

PHPならば、mb_convert_kana()関数で実現できます。
これを今回、Jqueryだけで実現する必要がありました。

そこで、いつものごとくググって調べて対処いたしました。
備忘録として記録いたします。

まずはできたものがこちら

実際にできたものがこちらです。

フォームに全角数字、アルファベットを入力し、変換ボタンを押すと半角に変換してくれます。

ソースはこちら

<!doctype html><html><head><metacharset="shift_jis"><title>Jquery 整数チェック</title><scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script><script>
$(document).ready(function()
{
	$("#msg").text("");

	$("#btn").on("click", function()
	{
		var text = $("#no").val();

		var disp_text = text.replace(//g, function(s) 
		{
			returnString.fromCharCode(s.charCodeAt(0) - 65248);
		});

		$("#msg").text(disp_text);		
	});
});

</script><styletype="text/css">.box 
{
	padding: 20px;
	width: 400px;
	margin-right: auto;
	margin-left: auto;
	margin-top: 30px;
	border: 1px solid #CCC;
	text-align: center;
}

.boxp
{
	text-align: left;
}

#btn
{
	padding-top: 10px;
	padding-right: 30px;
	padding-bottom: 10px;
	padding-left: 30px;
	margin-top: 10px;
}

#msg
{
	text-align: left;
}

fieldset
{
	margin-top: 10px;
	margin-bottom: 10px;
}

</style></head><body><divclass="box"><h1>全角→半角変換</h1><p></p><inputname="no"id="no"type="text"style="width:90%; padding: 10px;"value=><fieldset><legend></legend><divid="msg"></div></fieldset><inputname="btn"id="btn"type="button"value="変換"></div></body></html>Code language:HTML, XML(xml)

疑問:理屈がさっぱりわかりません!

ググってみると、Jqueryだけで全角半角変換する方法がすぐ見つかりました。
何も考えずにコピーするだけで動作しましたが、疑問がわきました。

どういう理屈で変換できているのか?

PHPの場合は、関数で一発変換してくれます。
しかし、Jqueryの場合は何やらいろんな細工をしています。

いわゆる力技で変換しています。
気になったので、変換の理屈について調べてみました。

Jqueryで全角半角変換を実現する理屈

ソースを見ただけだとさっぱり意味が分かりません。
ですが、ひとつひとつ何をしているのかわかると、単純な理屈で全角半角変換していることがわかりました。

変換部分のソース

<script>
$(document).ready(function()
{
	$("#msg").text("");

	// ボタンが押されたら発火
	$("#btn").on("click", function()
	{
		var text = $("#no").val();

		var disp_text = text.replace(//g, function(s) 
		{
			returnString.fromCharCode(s.charCodeAt(0) - 65248);
		});

		$("#msg").text(disp_text);		
	});
});
</script>Code language:HTML, XML(xml)

ソースを見ただけではさっぱりです。
特に、見たことのない関数が使用されており、何をしているのか想像もつきません。
ただ、関数の意味が分かると、変換の理屈が理解できました。

(1)text.replace(/[A-Za-z0-9]/g, ってなに?

textは、直前で入力文字を格納した変数です。
この入力文字(text)に対して、文字を上書きしています。

(/[A-Za-z0-9]/g は、正規表現で全角数字、アルファベットであったら次の値に上書きという意味です。

(2)s.charCodeAt(0) ってなに?

文字を文字コードに変換します。
端的に言うと、文字を数値化します。

「s.」は、引数として文字「s」が渡されており、渡された文字を数値化しています。
引数が「0」なのは、一文字目という意味です。

(3)65248を引き算しているのはなぜ?

これは全角文字コードと、半角文字コードの差分が「65248」個であるため、全角文字コードから65248減算すれば半角文字コードになります。

逆を行えば、半角→全角変換ができます。

(4)String.fromCharCode ってなに?

この関数は、数値化された文字コードを文字に変換します。
減算により全角→半角に変換した文字コードを文字に戻しています。

String. は、文字列という意味です。
return で記述しているため、文字列であることをキャストしています。

ちなみに半角→全角変換もできます。

今回のことを応用すれば、半角を全角に変換することもできます。
半角→全角変換サンプル

ソースはこちら

<!doctype html><html><head><metacharset="shift_jis"><title>Jquery 半角を全角に変換</title><scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script><script>
$(document).ready(function()
{
	$("#msg").text("");

	$("#btn").on("click", function()
	{
		var text = $("#no").val();

		var disp_text = text.replace(/[A-Za-z0-9]/g, function(s) 
		{
			returnString.fromCharCode(s.charCodeAt(0) + 65248);
		});

		$("#msg").text(disp_text);		
	});
});

</script><styletype="text/css">.box 
{
	padding: 20px;
	width: 400px;
	margin-right: auto;
	margin-left: auto;
	margin-top: 30px;
	border: 1px solid #CCC;
	text-align: center;
}

.boxp
{
	text-align: left;
}

#btn
{
	padding-top: 10px;
	padding-right: 30px;
	padding-bottom: 10px;
	padding-left: 30px;
	margin-top: 10px;
}

#msg
{
	text-align: left;
}

fieldset
{
	margin-top: 10px;
	margin-bottom: 10px;
}

</style></head><body><divclass="box"><h1>半角→全角変換</h1><p></p><inputname="no"id="no"type="text"style="width:90%; padding: 10px;"value="ABC123"><fieldset><legend></legend><divid="msg"></div></fieldset><inputname="btn"id="btn"type="button"value="変換"></div></body></html>Code language:HTML, XML(xml)

理屈がわかると理解できます

最近は、ググって見つけた記述をコピーするだけで動作します。
それはそれで解決できるのですが、問題点が発生したときに修正ができずに悩むことになります。

なぜならば理屈を理解していないため、どこを直せばよいかわからないためです。

わからないところは理解する。
これをやることで、本当の技術と知識が得られます。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております