🔢
javascriptで全角は2文字、半角は1文字な文字長(幅)の計算をワンライナーで行う
まずはワンライナーで
[..."abcあ😀"].reduce( (count,char) => count + Math.min(new Blob([char]).size,2) , 0)
> 7
ちょっと読みづらくなってしまうので、説明のために関数化してみる
const strWidthLen = (str) => {
return [...str]
.reduce( (count,char) => {
const len = Math.min(new Blob([char]).size,2)
return count + len
}, 0)
}
-
[...str]
はstring.split("")
と同義。文字列を配列にしている - reduceは合計計算のため
-
new Blob([文字列])
にてマルチバイトが計算出来る。- ただし絵文字などは4などが計算される。
- そのため、これを
Math.min
を利用することで1 or 2と丸める
- アラビア語などはちょっと未検証(そもそも2文字としてカウントするべきなのかがわからない…)
- 半角カナ等は考慮していない (comment)
参考: https://stackoverflow.com/questions/5515869/string-length-in-bytes-in-javascript
Discussion
アラビア語でなくても直観に反するケースがいくつかありますね
確かにですね。既知の問題として追記しておきます