🔢

javascriptで全角は2文字、半角は1文字な文字長(幅)の計算をワンライナーで行う

2020/09/19に公開約700字2件のコメント

まずはワンライナーで

[..."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

アラビア語でなくても直観に反するケースがいくつかありますね

[..."café"].reduce( (count,char) => count + Math.min(new Blob([char]).size,2) , 0)
// => 5

> [..."アイウエオ"].reduce( (count,char) => count + Math.min(new Blob([char]).size,2) , 0)
// => 10

確かにですね。既知の問題として追記しておきます

ログインするとコメントできます