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

公開:2020/09/19
更新:2020/09/30
1 min読了の目安(約700字TECH技術記事 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