前の「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を削除するようにしてみました。
これでたぶん大丈夫、、、
これだと、改行やタブ文字が0.5とカウントされてしまいますね。
the さま
ご指摘ありがとうございます!
おっしゃる通りですね。
また改めて修正したの記載させていただきます。
本当にありがとうございます!