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) で全角換算
- サイトの特徴: すべてクライアントサイドで処理し、通信なし