Skip to content
ブログに戻る
チュートリアル

文字数・単語数の制限 2026 — Twitter、SMS、SEO、Instagram

2026 年版の全プラットフォーム文字数・単語数制限ガイド:Twitter (280)、SMS (160/70 絵文字)、SEO meta (160)、Instagram、LinkedIn の計算原理とライブカウンター。

13 分で読める

文字数・単語数の制限 2026 — Twitter、SMS、SEO、Instagram

文字数制限とは、プラットフォームが一つのフィールドで受け付ける Unicode コードポイント(codepoint)の最大数のことだ。Twitter の投稿なら 280、GSM-7 エンコーディングの単一セグメント SMS なら 160、Google の meta description は切り詰められる前で約 160 文字。気にすべき数字は公開先によって変わるし、本文に絵文字、スマートクォート、CJK 文字が含まれるかどうかでも計算結果が変わる。

このガイドは、ソーシャルメディアのライター、SEO スペシャリスト、マーケティングコピーライター、セグメント単位で課金される SMS 送信者、そして Twitter や Instagram、SMS ゲートウェイが実際にカウントする方法と一致するバリデーションを書く開発者のためのものだ。25 プラットフォームのチートシートはクイックリファレンス表へ、6 つの主要プラットフォームに対して下書きをリアルタイムで照合するなら文字数カウンターを使えばよい。制限を超えた瞬間にプログレスバーが赤くなる。

クイックリファレンス — 全プラットフォームの文字・単語制限

以下の表は、ライターと開発者が最も頻繁に遭遇する 30 以上のフィールドを網羅している。「ハード制限」はプラットフォームが強制する上限、「可視 / fold より上」は切り詰めが入る前に読者が目にする範囲、「スイートスポット」はコンテンツが最もよくパフォーマンスする経験的な範囲だ。

プラットフォームハード制限可視 / fold より上スイートスポット絵文字のカウント
Twitter / X 投稿280 文字28070-100 文字1 コードポイント
Twitter / X bio160 文字1601 コードポイント
Twitter / X 表示名50 文字501 コードポイント
X Premium 長文25,000 文字1 コードポイント
Instagram キャプション2,200 文字最初の 125 文字(その後「もっと見る」)フックは 125 未満1 コードポイント
Instagram bio150 文字1501 コードポイント
Instagram ハッシュタグ最大 30 個5-10
LinkedIn 投稿3,000 文字最初の 210 文字(その後「see more」)1,300 未満1 コードポイント
LinkedIn 記事110,000 文字1 コードポイント
LinkedIn 見出し220 文字2201 コードポイント
Facebook 投稿63,206 文字デスクトップ ~477 / モバイル ~125オーガニックは 80 未満1 コードポイント
TikTok キャプション2,200 文字最初の ~100150 未満1 コードポイント
YouTube タイトル100 文字70(検索)60 未満1 コードポイント
YouTube 説明5,000 文字fold より上に最初の 100-150フックは最初の 1501 コードポイント
YouTube コメント10,000 文字1 コードポイント
Reddit タイトル300 文字60 未満(subreddit 依存)1 コードポイント
Reddit コメント10,000 文字1 コードポイント
Discord メッセージ2,000 文字2,0001 コードポイント
Discord embed description4,096 文字1 コードポイント
Slack メッセージ40,000 文字可読性のため 2,000 未満1 コードポイント
Pinterest ピン説明500 文字最初の 50-60125 未満1 コードポイント
Mastodon toot500 文字(設定可能)5001 コードポイント
Bluesky 投稿300 文字3001 grapheme cluster
Threads 投稿500 文字5001 コードポイント
SEO meta description(Google)デスクトップ ~160 文字 / モバイル ~120 文字150-160150-1601 コードポイント
SEO ページタイトル(Google)デスクトップ ~60 文字 / モバイル ~50 文字50-6050-601 コードポイント
Open Graph descriptionLinkedIn/FB で切られる前 ~200 文字150-200150-2001 コードポイント
Twitter Card description最大 200 文字200150-2001 コードポイント
SMS 単一セグメント(GSM-7)160 文字特殊 — 下記参照
SMS 単一セグメント(UCS-2 / 絵文字)70 文字1 コードポイント
WhatsApp メッセージ本文65,536 文字1 コードポイント
メール件名プラットフォーム制限なしデスクトップ ~60 / モバイル ~3050 未満1 コードポイント
Google Ads 見出し30 文字 × 15 見出し各 30301 コードポイント
Google Ads 説明90 文字 × 4 説明各 90901 コードポイント
App Store タイトル30 文字30301 コードポイント
App Store サブタイトル30 文字30301 コードポイント
App Store 説明4,000 文字fold より上に最初の 252フック 2521 コードポイント
Play Store 短い説明80 文字80801 コードポイント
Play Store 詳細説明4,000 文字fold より上に最初の 80フック 801 コードポイント

「スイートスポット」のラインを超えるコンテンツは、切り詰められたり、ランクを下げられたり、可視カードからクロップされたりする傾向がある。X Premium 長文と Mastodon(インスタンス単位で設定可能)は、ペナルティなしに 500 文字超を書ける数少ない例外だ。上記のカウントは SMS のルールが適用される箇所を除き、すべて Unicode コードポイント単位で、絵文字 1 つは 2 文字ではなく 1 文字としてカウントされる。下書きを 6 つの主要な制限に対して一度に検証するには、文字数カウンターに貼り付ければよい。公開を押す前にプログレスバーが超過分を検出してくれる。

文字は実際にどう数えられるか(Unicode コードポイント vs UTF-16)

同じ文字列に対して、ツールごとに違う文字数が返ってくることがある。理由は、「文字」というのは単一の概念ではないからだ。Unicode コードポイントを指すこともあれば、UTF-16 のコードユニット(code unit)、grapheme cluster を指すこともあり、プラットフォームによって採用する単位が違う。

「文字」とは何か — コードポイント vs コードユニット vs grapheme

**コードポイント(codepoint)**は Unicode のスカラー値で、Unicode が文字に割り当てたか予約済みとマークした U+0000 から U+10FFFF までの任意の整数だ。**コードユニット(code unit)**はエンコーディングの最小単位で、UTF-16 は 16 ビット、UTF-8 は 8 ビットのコードユニットを使う。grapheme cluster は人間が単一の可視文字として知覚するもので、コードポイント 1 つの場合もあれば、ベースコードポイントに結合マークが付いた形、家族絵文字 👨‍👩‍👧‍👦(7 つのコードポイントが結合されて 1 つの可視グリフになる)のような zero-width-joiner シーケンスの場合もある。

文字列 "a🌍👨‍👩‍👧" では、三つのカウントが食い違う。

カウント方法結果採用先
UTF-16 コードユニット(JS の string.length10素朴な JavaScript コード
Unicode コードポイント6Twitter、Instagram、SMS ゲートウェイ
Grapheme cluster3Bluesky、スクリーンリーダー、テキストエディタ

string.length が絵文字について嘘をつく理由

JavaScript は内部的に文字列を UTF-16 で保持する。U+FFFF を超えるコードポイント(すべての絵文字、すべての astral-plane 文字)は、サロゲートペア(surrogate pair)、つまり 2 つの 16 ビットコードユニットとしてエンコードされる。.length プロパティはその 2 ユニットを返し、1 文字とはカウントしない。

"🌍".length              // 2   (UTF-16 code units)
[..."🌍"].length         // 1   (codepoints — what Twitter/SMS counts)
"🌍".match(/./gu).length // 1   (codepoints via regex with /u flag)

スプレッド演算子と /u regex フラグはどちらもコードポイント単位で反復し、これは Twitter、Instagram、SMS ゲートウェイが制限と比較する単位と一致する。生の .length を使うバリデーション関数は、実際には上限内のツイートを拒否したり、もっと悪い場合は、下流システムが拒否する 285 コードポイントの下書きを通してしまうこともある。

CJK と結合マークについて

中国語、日本語、韓国語の表意文字はそれぞれ単一のコードポイントであり、どのプラットフォームでも 1 文字としてカウントされる。コストが跳ね上がるのは SMS で、GSM-7 以外の文字が 1 つでも含まれると、メッセージ全体が UCS-2 エンコーディングに切り替わり、セグメント制限が 160 から 70 に落ちる(次のセクションで扱う)。

結合マークの挙動は異なる。アクセント付き áá と書けば 1 コードポイント、同じ áa + ́(結合アキュート)として書けば 2 コードポイント・1 grapheme cluster だ。ほとんどのプラットフォームはコードポイントで数えるので、後者は 1 文字余計にコストがかかる。Bluesky が目に見える例外で、grapheme cluster で数えるためどちらも 1 となる。

各言語でのカウント — クイックリファレンス

// JavaScript
[...str].length                          // codepoints
Array.from(str).length                   // codepoints

// Python 3 — len() is codepoint by default
len(s)

// Go — utf8 package
utf8.RuneCountInString(s)

// Rust — chars() iterates codepoints
s.chars().count()

// Java — codePointCount
s.codePointCount(0, s.length())

対比として、Base64 デコード・エンコードは逆方向の話になる。テキストを伝送のために Base64 にエンコードすると、UTF-8 入力 3 バイトごとに ASCII 出力 4 文字になるため、エンコード後の長さはコードポイント数ではなくバイト数で決まる。絵文字を 1 つ貼り付けて、Base64 出力が 8 文字に膨らむのを観察してほしい。Twitter で 1 文字としてカウントされる同じ絵文字が、UTF-8 では 4 バイトを占める。

下書きでコードポイント数(Twitter が実際に計測する数)を確認するには、文字数カウンターがデフォルトで Unicode 正確だ。

SMS 文字数制限 — GSM-7、UCS-2、マルチパートメッセージ

SMS は、絵文字を 1 つ加えるだけで請求額が文字どおり倍になりうる唯一の主要チャネルだ。理由はエンコーディングにあり、計算式は 1985 年から変わっていない。

160 文字というマジックナンバー — GSM-7 の歴史

1985 年の GSM-03.38 規格は、SMS のペイロードを 140 バイトに固定した。7 ビット文字エンコーディングなら 140 バイトに 1,120 ビット ÷ 7 = 160 文字が入る。これが有名な sms character limit 160 の由来だ。GSM-7 文字セットは 128 のベース文字に加え、10 文字の拡張({ } [ ] | \ ~ ^ € とフォームフィードをカバー)を持つ。このセット内なら、セグメントあたり 160 文字をフルに使える。

GSM-7 の外側に出て切り替えを引き起こす文字は次のとおり。

  • すべての絵文字
  • 巻きクォート / スマートクォート(" " ' ')——これらは ASCII の直線クォート " ' とは別物
  • GSM-7 に含まれる 35 字を超えるアクセント付きラテン文字の大半(é á ñ ü ø など。GSM-7 には ä ö å æ ø à è ì ò ù ほか数文字のみ)
  • 全角句読点、CJK 文字、アラビア文字、ヘブライ文字、ギリシャ語小文字、キリル文字
  • バッククォート ` とチルダ ~(チルダは GSM-7 拡張表にあるので、160 字のうち 2 文字を消費する)

UCS-2 の罠 — 絵文字 1 つで 160 が 70 に落ちる

GSM-7 以外の文字がメッセージのどこかに 1 つでも現れた瞬間、メッセージ全体が UCS-2 エンコーディングに切り替わる。UCS-2 は 1 文字あたり 16 ビットを使うので、140 バイト ÷ 2 = セグメントあたり 70 文字となる。実例。

"Hello, your code is 12345"            → 26 chars, GSM-7, 1 segment
"Hello, your code is 12345 ✓"          → 28 chars, GSM-7 (✓ in extension), 1 segment
"Hello, your code is 12345 ✅"          → 28 chars, UCS-2 (emoji), 1 segment (under 70)
"Hello, "your" code is 12345 ✅"        → smart quotes + emoji → UCS-2
"Hi 你好"                                → CJK → UCS-2, 1 segment (5 chars)

最後の Hi 你好 の例こそが落とし穴だ。たった 5 文字なのに UCS-2 料金を食い、次に追加する 65 文字までは 1 セグメントに収まり、その後セグメント 2 が始まる。

マルチパート SMS セグメント(連結)

160(GSM-7)または 70(UCS-2)を超えると、メッセージは複数のセグメントに分割される。各セグメントは再構成のために 7 文字の User Data Header(UDH)を運ぶので、セグメントあたりの利用可能ペイロードが減る。

  • GSM-7 マルチパート:セグメントあたり 153 文字
  • UCS-2 マルチパート:セグメントあたり 67 文字

受信側の端末は受信者に見えないかたちでセグメントを再構成する。だが課金はメッセージ単位ではなくセグメント単位だ。161 文字の GSM-7 メッセージは 2 セグメントぶんかかる。1,000 文字の GSM-7 メッセージは 7 セグメントかかる(153 × 6 = 918、7 番目のセグメントが残り 82 を運ぶ)。

コスト計算 — 絵文字 1 つで請求額が倍になるとき

80 文字のプレーンテキストのマーケティングメッセージを考えよう。

  • プレーンテキスト:80 文字 → GSM-7 → 価格 X の 1 セグメント
  • 絵文字を 1 つ追加:80 文字 → UCS-2 → 80 > 70 → 価格 2X の 2 セグメント

絵文字 1 つで請求額が倍になるのは現実の話で、しかもスケールする。10 万通のキャンペーン、セグメントあたり $0.0075 とすると、GSM-7 なら $750、UCS-2 なら $1,500——$750 の絵文字だ。主要な SMS プロバイダはすべて(Twilio、Bandwidth、AWS SNS、MessageBird、Vonage)この方式で課金する。エンコーディングのルールはベンダーのポリシーではなく GSM 規格だ。バイトレベルのエンコーディングのトレードオフの深い歴史と、なぜ ASCII / UTF-8 / UCS-2 が別個の規格として存在しているのかについては、Base64 を理解するで扱っている。SMS ではなくメールに適用された、同じ「ビットを文字にする」系の問題だ。

メッセージを GSM-7 に保つ方法

  • スマートクォートではなく ASCII の直線クォート " ' を使う
  • em-dash や en-dash ではなく ASCII ハイフン - を使う
  • ©® ではなく (c)(R) と綴る
  • キャンペーン予算が UCS-2 コストを織り込んでいない限り、絵文字を避ける
  • プロバイダのコンソール(Twilio、Bandwidth、MessageBird など)はプレビューの隣に「encoding: GSM-7」または「UCS-2」と表示する。配信前に必ず確認する

下書き中の最速のサニティチェックは、文字数カウンターの SMS プログレスバーで、これは 160 文字基準に対して報告する。テキストが UCS-2 をトリガーするなら、文字数を 2.29 で割って 70 字ルール下のセグメント数を概算すればよい。

SEO 制限 — Meta description、タイトルタグ、OG、Twitter Card

SEO の文字数制限はプラットフォーム制限よりもソフトだ。Google は meta description が 300 文字になっても拒否はしない。だが実用上の切り詰めルールはクリックスルー率に効いてくる。2026 年でも通用する数字は次の通り。

Meta description — 150-160 文字のスイートスポット

Google のデスクトップ検索結果は meta description を 155-165 文字あたりで切り詰める。モバイルは 100 から 120 のあいだのどこかで切る。正確な切り詰めポイントが揺れるのは、Google が表示ピクセルを計測しており、文字数を計測していないからだWM のグリフだらけの説明文は、il だらけのものより早く切り詰めピクセルに達する。

実用的なライティング規則。

  • 合計 150-160 文字を狙う
  • 中核メッセージを最初の 120 文字に置く(モバイルセーフ)
  • ページの meta description character limit キーワードを最初の 30 文字に置いてリードする
  • 最後の 30 文字に CTA を置いて締める。デスクトップが中央を切っても読める

2017-2018 年の時期、Google は一時的に meta description の表示を 320 文字に拡大しており、当時の SEO チュートリアル世代はいまだにこの数字を引用している。Google は 2018 年半ばに 160 に戻した。今 200 文字を超えて書いても、後半が隠れるだけだ。

別の失敗パターンもある。120 文字未満の説明文は、まるごと差し替えられることが多い。Google は「あなたの説明文はクエリに完全には応えていない」と判断し、ページ本文から別のパッセージを引っ張ってくる。警告なしに CTR コントロールを失う。

タイトルタグ — デスクトップ 60、モバイル 50

タイトルタグはデスクトップで約 60 文字、モバイルで約 50 文字で切れる。説明文と同じピクセルベースの切り詰めで、ワイドグリフについての注意点も同じだ。

スイートスポット:50-60 文字、ターゲットキーワードを最初の 30 文字に置けば、どんな切り詰めにも生き残る。ロングテールのブランドサフィックス(| Brand Name)は末尾、つまり切り詰めの痛みが最も小さい場所に置くのがよい。

ピクセル幅 vs 文字数 — Google の実際の規則

Google の SERP の説明文コンテナはデスクトップで約 920 ピクセル幅だ。平均的な文字幅は約 6.5 ピクセルで、これが経験的な目標 140-160 文字を生む。だが文字あたりの広がりは大きい。i は約 3 ピクセル、M は約 11 ピクセルでレンダリングされる。全大文字のコピー(“BEST WIDGETS FOR WINTER WEDDINGS”)は、小文字版よりずっと早く切れる。

SEO コピーには、文字数カウンターよりピクセル正確な SERP シミュレータによる公開前プレビューのほうが信頼できる。

OG description と Twitter Card description

Open Graph プロトコルの og:description は、Facebook、LinkedIn、Slack、Discord が共有リンクのプレビュー下に描画するものだ。表示上限はプラットフォームによって異なり、多くは約 200 文字で切れ、一部は 300 まで延びる。Twitter Card の twitter:description は Twitter のパーサーで 200 文字にハードキャップされている。

合理的なデフォルト。

  • OG と Twitter Card の両方で 150-200 文字
  • meta description と同じにしてもよいが、OG の長さは検索ランキングに影響しないので OG は少し長めにできる
  • 構造化データの選択(特に誤って OG に引かれてくるもの)の検証には、セキュリティのベストプラクティスで扱うパターンを使う。信用できない OG メタデータはよくあるフィッシングのベクタだ

「文字数制限なし」が実際に意味するもの

H1 タグ、本文コンテンツ、URL slug にはプラットフォーム強制の SEO 文字数制限はないが、ソフトな上限は依然として適用される。

  • H1 が 70 文字を超えると、視覚的階層とスキャナビリティが崩れる
  • URL slug は技術的には無制限。Google は SERP で約 90 文字を表示し、それ以上は装飾扱い
  • 本文の長さに上限はないが、Google は水増しではなく有用なコンテンツを評価するので、単語数だけではランキングシグナルにならない

文字数カウンターは、ドラフト中に meta description(160)とタイトルタグ(60)の両方をリアルタイムに追跡し、切り詰めピクセルに近づくとプログレスバーが黄色から赤に変わる。

ソーシャルプラットフォーム — Twitter/X、Instagram、LinkedIn、Facebook ほか

各プラットフォームの文字数の天井には、その背景にある経緯と、ハード制限の下に位置する「コンテンツが実際にパフォーマンスするスイートスポット」がある。

Twitter / X — 280、Premium 25,000、URL 置換ルール

標準の twitter character limit は 280 文字で、2017 年 11 月に 140 から倍増した。X Premium 加入者は 25,000 文字までのリッチフォーマット対応の長文を投稿できるが、オーガニックリーチではいまだに 280 文字の投稿が支配的な形だ。

自明でないルールが URL 置換だ。Twitter は公開時にすべての URL を——どれだけ長くても——23 文字の t.co 短縮リンクに包む。23 文字というコストは固定だ。

published_length = raw_length − URL_length + 23

例:"Check this: https://example.com/very-long-path?id=12345" という下書きは生で 53 文字。URL は 38 文字なので 23 文字の t.co リンクに置き換えられ、公開後の長さは 53 − 38 + 23 = 38 文字になる。気付かなかった 15 文字の節約だ。

長い URL を下書きに貼り付けるとき、URL エンコード・デコードは何が URL としてカウントされるかを素早く確認する手段になる(Twitter は RFC 3986 のパターンで URL を認識し、クエリ文字列とフラグメントも含む)。サブドメイン、スキーム、ポート、パス、クエリ、フラグメントはすべて 23 文字の置換に飲み込まれる。

その他の Twitter のフィールド:表示名 50 文字、bio 160 文字、ハンドル 15 文字。Threads(Meta の Twitter 相当)は代わりに 500 文字制限を採用している。

Instagram — 2,200 のキャプション、ハッシュタグ 30、125 文字のフック

Instagram のキャプションは 2,200 文字まで許されるが、フィードに見えるのは最初の 125 文字だけで、残りは「…もっと見る」のタップの裏に折り畳まれる。読者の半数以上はタップしない。エンゲージメントに効く instagram caption limit は実質 125 で、ハード制限 2,200 ではない。

ハッシュタグ 30 個の上限はハードだ。31 個目を試みると投稿が失敗する。5-10 個のハッシュタグの範囲が最もパフォーマンスする傾向にあり、11 個を超えると発見ブーストが頭打ちになり、アルゴリズムからはスパムっぽく見え始める。

その他のフィールド:bio 150 文字、表示名 30 文字、DM 1,000 文字。

LinkedIn — 3,000 の投稿、1,300 のスイートスポット、「see more」のフォールド

投稿の linkedin character limit は 3,000 文字だが、フィードは「see more」フォールドの前で最初の 210 文字だけを表示する。LinkedIn で勝つ投稿は 1,200-1,500 文字の範囲にある(複数の Buffer や Hootsuite の調査がピークとしてだいたい 1,300 に収束している)。価値を示すには十分長く、スクロールに疲れさせないには十分短い。

LinkedIn Articles(長文出版面)は 110,000 文字を許す。事実上無制限だ。プロフィールの見出しは 220 文字、about セクションのテキストは 2,600 文字でキャップされる。

Facebook — 63,206 文字、オーガニックは 80 文字スイートスポット

Facebook の 63,206 文字の投稿上限は雑学に近い。実際には 80 文字未満の投稿は長い投稿より約 30% 高いオーガニックエンゲージメントを得る(HubSpot がこれを毎年安定して報告している)。fold より上ではデスクトップで約 477 文字、モバイルは約 125 文字で切れる。

コメントの最大は 8,000 文字。リアクション、シェア、クリックスルーはすべて短い投稿に偏るので、長いコピーはリンク先の記事に置き、Facebook のキャプションには置かない。

新興プラットフォーム — Bluesky、Mastodon、Threads、TikTok

  • Bluesky の投稿は 300 文字でキャップされ、特殊なケースだ。Bluesky は grapheme cluster で数えるので、7 コードポイントの家族絵文字 👨‍👩‍👧‍👦 は 7 文字ではなく 1 文字としてカウントされる
  • Mastodon はデフォルトで toot あたり 500 文字だが、インスタンス管理者は 5,000、あるいは無制限まで引き上げられる。投稿先のインスタンスを確認すること
  • Threads は Twitter スタイルの 500 文字制限でコードポイントカウントを採用
  • TikTok のキャプションは 2,200 文字を許し、fold より上に約 100 文字が表示される

Reddit、Discord、Slack — 長文とコミュニティのデフォルト

  • Reddit のタイトルは 300 文字(subreddit のモデレータが AutoModerator で 60 未満を強制することが多い)、コメントは 10,000 文字
  • Discord の標準メッセージは 2,000 文字、embed description は 4,096、Nitro はプレーンメッセージで 4,000 まで引き上げる
  • Slack のメッセージは 40,000 文字。2,000 を超えると可読性が急落し、多くの受信者は長いメッセージを無視する

コンテンツタイプ別の単語数ターゲット

文字数制限はソーシャルと SEO を支配し、単語数はそれ以外のすべて——学術、課金、コンテンツマーケティング、長編原稿——を支配する。以下の表は、各代表的コンテンツタイプの目標範囲と読了時間の推定値(230 wpm、Brysbaert 2019 黙読メタアナリシス中央値)を示す。

コンテンツタイプ単語ターゲット読了時間 @ 230 wpm備考
ツイート30-40 単語10 秒単語ではなく文字で最適化
LinkedIn 投稿(スイートスポット)170-250 単語1 分fold より上
Instagram キャプション(フック)20-25 単語10 秒未満最初の 125 文字
ブログ — 短い500-700 単語2-3 分リスト記事、ニュース、ホットテイク
ブログ — 標準1,000-1,500 単語4-7 分チュートリアル、深掘りガイド
ブログ — 長い2,000-3,000 単語9-13 分包括的ガイド
SEO ピラーページ2,500-5,000 単語11-22 分トピカルオーソリティ
学術エッセイ(高校)500-1,500 単語2-7 分課題により変動
学術エッセイ(大学学部)1,500-3,000 単語7-13 分課題により変動
NaNoWriMo デイリー1,667 単語/日30 日で 50K 単語
小説 — 短い50,000-70,000 単語YA、ミステリー
小説 — 標準80,000-100,000 単語大人向けフィクション
講演(12 分 @ 130 wpm)1,500-1,600 単語発話リハーサルで確認
ポッドキャストエピソード(30 分 @ 130 wpm)3,900 単語発話台本部分

コンテンツマーケティングでは、読了時間のほうが単語ターゲットより有用な単位だ。読者は「5 分で読める」というラベルに、「1,150 単語」というラベルよりも安定して反応する。単語数は依然として、課金(翻訳は原文単語あたりで請求される)、プラットフォーム遵守(NaNoWriMo の 50K、学術の 2,000 単語上限)、契約条件の単位として残る。文字数カウンターは入力中にこの両方をリアルタイム表示し、講演やポッドキャスト用に 130 wpm での発話時間も併せて表示する。

実プロダクトを壊す 6 つのカウントミス

これらは実稼働のコードや、実施済みのマーケティングキャンペーンで繰り返し目にする失敗だ。各項目で症状、根本原因、修正をセットにしてある。

ミス 1:文字数バリデーションに string.length を使う

症状: ユーザーが絵文字 3 つ入りのツイートを貼り付ける。実際には 270 コードポイントだ。フロントエンドのバリデーションは 276 と表示し送信を拒否する。あるいは、もっと悪いことに、絵文字の予算が相殺して 285 コードポイントの下書きが通過し、Twitter がサーバー側で拒否する。

根本原因: JavaScript の String.prototype.length は UTF-16 コードユニットを返す。すべての絵文字はサロゲートペアで、2 ユニットを消費する。すべての astral-plane 文字(数学記号、古代文字)も同様だ。

修正: スプレッド演算子または Array.from でコードポイント単位に反復する。

// ❌ wrong
function isUnderTwitterLimit(text) {
  return text.length <= 280;
}

// ✅ correct
function isUnderTwitterLimit(text) {
  return [...text].length <= 280;
}

regex ベースのコードポイント反復パターン(grapheme cluster 対応を含む)の詳細は、正規表現チートシート/u/v フラグ、Unicode プロパティエスケープを扱っている。

ミス 2:単語数のために CJK テキストを空白で分割する

症状: 500 文字の中国語記事が 1 単語と報告される。それに基づいた翻訳の見積もりが 500 倍ずれる。

根本原因: CJK 言語は単語間スペースを使わない。text.split(/\s+/) はエッセイ全体を含む単一のトークンを返す。

修正: CJK 表意文字 1 つを 1 単語として数える。これは Microsoft Word、Google Docs、すべてのネイティブ CJK ワープロが採用する慣習だ。

function countWordsMixed(text) {
  const cjk = (text.match(/[一-鿿぀-ヿ가-힯]/g) || []).length;
  const latin = (text
    .replace(/[一-鿿぀-ヿ가-힯]/g, ' ')
    .match(/[A-Za-z0-9]+(?:['’-][A-Za-z0-9]+)*/g) || []).length;
  return cjk + latin;
}

Unicode 範囲は CJK 統合漢字(U+4E00 から U+9FFF)、ひらがなとカタカナ(U+3040 から U+30FF)、ハングル音節(U+AC00 から U+D7AF)をカバーする。これは Microsoft Word の単語数機能が表意文字としてカウントする 4 つのブロックだ。

ミス 3:Twitter の URL 23 文字置換を忘れる

症状: カウンターは 80 文字の URL を含む 320 文字の下書きを表示する。10 分かけてトリミングしてようやく、オリジナルが 263 文字として Twitter に受け入れられたはずだったことに気付く。

根本原因: Twitter は公開時にすべての URL を 23 文字の t.co リンクに置き換える。生のカウンターはそれを知らない。

修正: 各 URL について raw − URL_length + 23 で公開後の長さを事前計算する。複数 URL を含む下書きでは、補正を合算する。公開コンテンツでの URL 検出は RFC 3986 に従う。URL エンコード・デコード ガイドが同じ解析ルールを順に説明している。

ミス 4:meta description を 320 文字で書く(古いガイドライン)

症状: 末尾に CTA を据えた 280 文字の meta description を仕上げた。Google の検索結果では、説明文は 158 文字目で文の途中で切れ、CTA は決して現れない。

根本原因: 2017 年 12 月から 2018 年 5 月のあいだ、Google は一時的に meta description の表示を 320 文字に拡大した。多くの SEO チュートリアルが今もこの数字を引用している。Google は 2018 年半ばに約 160 に戻し、それ以来そこに留まっている。

修正: 150-160 文字で書く。プライマリキーワードを最初の 30 文字に、CTA を最後の 30 文字に置く。重要なページにはピクセル正確な SERP シミュレータを使う。ワイドグリフ(WMK)は狭いグリフ(ilt)よりも予算を早く食いつぶす。

ミス 5:280 文字を 280 単語と混同する

症状: チームの誰かが「280 単語のツイートが必要」と書き、見事な散文で 1,500 文字を仕上げる。そのツイートは投稿できない。

根本原因: 文字 vs 単語の混同。英文の散文では、両者はおおむね 5-6 倍違う。

修正: プラットフォーム単位でルールを固定する。Twitter、SMS、SEO meta は文字を数える。NaNoWriMo、学術課題、翻訳契約、大半のコンテンツマーケティングのブリーフは単語を数える。迷うときは仕様を確定する前にプラットフォーム自身のカウンター(Twitter の作成ボックス、Word の「校閲 > 文字数カウント」)を確認する。

ミス 6:スマートクォートを貼り付けて SMS を静かに UCS-2 に切り替える

症状: Google Docs から顧客レシートのテンプレートを SMS 送信機にコピーする。オリジナルは 145 文字、GSM-7 で 1 セグメントとして送信されていた。貼り付け後も同じ 145 文字だが、UCS-2 で 2 セグメント請求される。100 万通のキャンペーンで費用が倍になる。

根本原因: Google Docs と Word は "' を活字家のクォート " " ' ' に自動変換する。それらのクォートは GSM-7 文字セットに含まれていないので、メッセージ全体が UCS-2 に切り替わる。

修正: 送信前に正規化する。

function toGsm7Quotes(s) {
  return s
    .replace(/[“”]/g, '"')   // " " → "
    .replace(/[‘’]/g, "'")   // ' ' → '
    .replace(/[–—]/g, '-');  // – — → -
}

課金に関わる送信の前にこれを走らせる。Twilio、MessageBird、Bandwidth はすべて応答にエンコーディングフィールドを出す。ログを取り、GSM-7 として意図したテンプレートに UCS-2 が現れたらアラートを上げる。

FAQ

文字数と単語数の違いは何か

文字数は、スペース、句読点、絵文字を含むすべての文字を数え、現代のほとんどのプラットフォームでは Unicode コードポイントで計測される。単語数は、ラテン系スクリプトでは空白区切りのトークン、CJK では表意文字 1 つを 1 単語として数える。Twitter、SMS、SEO meta description は文字数を使う。学術エッセイ、NaNoWriMo の原稿、翻訳請求書は単語数を使う。

Twitter は絵文字を 1 文字として数えるのに、JavaScript が 2 文字として数えるのはなぜか

Twitter は Unicode コードポイントで計測する。絵文字 1 つはコードポイント 1 つで、1 文字だ。JavaScript の string.length は UTF-16 コードユニットを計測する。多くの絵文字は U+FFFF より上にあり、UTF-16 ではサロゲートペアとしてエンコードされるので 2 コードユニットを取り、.length は 2 を返す。Twitter が実際に数えるコードポイント数を得るには [...text].lengthArray.from(text).length を使う。

SMS の文字数制限が 160 のときと 70 のときがあるのはなぜか

SMS はデフォルトで 7 ビットの GSM-7 エンコーディングを使い、140 バイトのペイロードに 160 文字が入る。メッセージに GSM-7 にない文字(絵文字、スマートクォート、CJK、ごく一部以外のアクセント付きラテン)が 1 つでも含まれると、メッセージ全体が 16 ビットの UCS-2 エンコーディングに切り替わり、セグメントあたりの制限が 70 文字に落ちる。メッセージ内のどこか 1 か所に絵文字があるだけで切り替えがトリガーされる。

2026 年における meta description の理想的な長さは

150-160 文字を狙う。Google のデスクトップ SERP は表示ピクセル幅に応じて 155-165 あたりで切り詰めるし、モバイルは 100 から 120 のあいだで切る。120 文字未満では、Google はあなたの説明文をページ本文のパッセージでまるごと置き換えることが多い。プライマリキーワードを最初の 30 文字に、CTA を最後の 30 文字に置けば、どちらの方向に切り詰められてもメッセージが生き残る。

文字数制限にはスペースや絵文字も含まれるか

実質的にあらゆるプラットフォームで含まれる。スペース、改行、句読点、絵文字はそれぞれ Unicode コードポイント 1 つとして数えられる。知っておくべき例外は二つある。前述の通り絵文字がエンコーディング切り替えをトリガーする SMS、そして grapheme cluster で数える Bluesky だ。Bluesky では家族絵文字 👨‍👩‍👧‍👦 のような複数コードポイントの絵文字も 7 文字ではなく 1 文字で済む。

中国語、日本語、韓国語のテキストでは単語数はどう計算されるか

CJK 表意文字 1 つを 1 単語として数える。これは Microsoft Word の中国語モードの単語数機能、Google Docs、ネイティブの CJK エディタ、すべての商用翻訳メモリシステムが採用する慣習だ。500 文字の中国語エッセイは 500 単語と報告される。混在テキストは、CJK 表意文字を文字単位、ラテン系トークンを空白単位で数え、両者を合算する。

Twitter は 280 文字制限内で URL の長さをどう扱うか

Twitter は元の長さに関係なく、公開時にすべての URL を 23 文字の t.co 短縮リンクに自動的に包む。公開後の長さは URL ごとに published = raw − URL_length + 23 の式に従う。100 文字の URL を 1 つ含む 320 文字の下書きは、243 文字として送信される。Twitter は RFC 3986 のパターンで URL を認識するので、クエリ文字列とフラグメントも URL トークンに吸収される。

関連記事