JavaScriptで全角2文字、半角1文字でカウントする

前の「JavaScriptで文字数でなくてバイト数を求める」だとUTF8ベースなので、1文字が3バイトや4バイトになってしまう…

なので、今回は全角2文字、半角1文字でカウントする関数を作ってみました。
他の国の言葉は知らないので、完全ではないでしょうが、日本語だったらこれで大丈夫かなぁ…

不味かったらご指摘ください。

function bytes(str) {
	str = str.replace(/[。-゚]/g, 'K');
	var hex = '';
	for (var i = 0; i < str.length; i++) {
		hex += str.charCodeAt(i).toString(16);
	}
	return hex.length/2;
}

軽く解説:
まず引数の半角カタカナを1バイトでカウントするために、'K'に置き換えています。
次は、charCodeAt&toString(16)で文字コードを16進数に変換してます。
最後に、16進数に変換した文字列の文字数を2で割ってるだけです。
ちなみに、charCodeAtはUTF16の文字コードを10進数で返してくれます。
んでもって、toString(16)はNumberを16進数にしてくれます。
toString(16)の0埋めは、入力できる文字は0x20からだから気にしなくて良さそうだ。

追記:2020/04/21
theさまからご指摘いただいたので、修正しました。

function bytes(str) {
	str = str.replace(/[。-゚]/g, 'K');
	var hex = '';
	for (var i = 0; i < str.length; i++) {
		hex += (('0000' + str.charCodeAt(i).toString(16)).slice(-4)).replace(/^00/, '');   // <- ここ修正
	}
	return hex.length/2;
}

軽く解説:
改行やタブ文字は、toString(16)だと0埋めしてくれないので、
一旦4桁0埋めして、先頭の00を削除するようにしてみました。
これでたぶん大丈夫、、、

「JavaScriptで全角2文字、半角1文字でカウントする」への2件のフィードバック

    1. the さま
      ご指摘ありがとうございます!
      おっしゃる通りですね。
      また改めて修正したの記載させていただきます。

      本当にありがとうございます!

コメントを残す

メールアドレスが公開されることはありません。