コンテンツにスキップ
Zenn Dev Snowcait Articles 40620fb90fbfb6

文字数をカウントするサイトを作った

  • URL: https://zenn.dev/snowcait/articles/40620fb90fbfb6
  • 日付: 2026-06-26
  • Tier: Tier 3
  • 要旨: 文字数カウントサイトの閉鎖を機に、より正確なカウントを目指した代替サービスを自作した記録。JavaScript の length プロパティはサロゲートペア・異体字セレクタ・ZWJ シーケンス等を正しく扱えないため、graphemesplit ライブラリや将来的には Intl.Segmenter を使ったグラフェム単位のカウントが必要になる。X(Twitter)の文字数換算には twitter-text ライブラリを使い、URL を半角23文字固定として換算する特殊ロジックにも対応している。

詳細

正確な文字数カウントの実装における技術的考察

  • 元サイトのカウントロジック: text.replace(’\n’, ‘’).length(スペース込み)、/\s| /g で空白除去、改行数+1で行数計算など
  • length の限界: サロゲートペア、異体字セレクタ、結合文字、ZWJ(絵文字シーケンス)を複数コードポイントとしてカウントしてしまう
  • 対応方法:
    • graphemesplit ライブラリ: split(text).length でグラフェム単位カウント(現時点では推奨)
    • Intl.Segmenter: […new Intl.Segmenter(‘ja’, { granularity: ‘grapheme’ }).segment(text)].length(Firefox 125 以降で対応)
  • X (Twitter) の文字数換算:
    • twitter-text(OSS)を使用。URLは半角23文字固定
    • Math.ceil(twitter.parseTweet(text).weightedLength / 2) で全角換算
  • サイトの特徴: すべてクライアントサイドで処理し、通信なし