SNSの字数はどう数えられているか — 日本語1字が2字になる場所
投稿欄の隅に出ている残り字数は、どこかで誰かが決めた数え方の結果です。その数え方は一つではありません。同じ文字列を、機械は少なくとも4通りの長さで測ります。家族の絵文字1つの長さは、測り方によって1、5、8のどれにもなります。どれも間違っていません。
一つの文字列に、長さが4つある
まず言葉を分けます。ここで出てくる4つのものさしは別物です。
- UTF-16の単位 — プログラムが素朴に文字列の長さを取ったときに返る数
- 符号位置 — Unicodeが1つずつ番号を振った、文字の最小単位
- 書記素クラスタ — 人が「1文字」と見る塊
- 重み付き字数 — Xが投稿の上限に使う独自の数え方
家族の絵文字(父・母・娘)を測ると、こうなります。この絵文字は3つの人物の絵をZWJという見えない接着剤でつないだもので、内訳は U+1F468 / U+200D / U+1F469 / U+200D / U+1F467 の5つです。
| ものさし | 家族の絵文字 | タイ語の「สวัสดี」 | 犬 |
|---|---|---|---|
| UTF-16の単位 | 8 | 6 | 1 |
| 符号位置 | 5 | 6 | 1 |
| 書記素クラスタ | 1 | 4 | 1 |
| Xの重み付き字数 | 8 | 6 | 2 |
絵文字だけの話ではありません。タイ語の挨拶は符号位置では6ですが、母音記号が子音に乗るので目に見える塊は4つです。書記素クラスタが必要なのは、この「乗る文字」があるからで、絵文字はその一番派手な例にすぎません。
Xが「1」と数える範囲は U+10FF で切れている
Xの上限は280です。日本語で書くと140字程度で埋まるのは、仮名や漢字が1字あたり2として数えられるからです。ではどの文字が1でどの文字が2なのか。Xが公開している設定表では、1として数える符号位置の範囲が4つだけ挙げられており、それ以外はすべて2になります。
- U+0000〜U+10FF
- U+2000〜U+200D
- U+2010〜U+201F
- U+2032〜U+2037
1つ目の範囲がラテン文字からグルジア文字までを含み、そこで打ち切られています。だからロシア語の「Привет」は6字ぶんですが、日本語・中国語・韓国語はU+3000より後ろにあるので全部2です。安いのは文字の難しさではなく、Unicodeの並び順です。
面白いのは2つ目と3つ目です。ZWJはU+200Dなので、ぎりぎり1として数えられます。ダッシュ(—、U+2014)は3つ目の範囲に入るので1ですが、三点リーダー(…)はU+2026で範囲の外なので2です。日本語の小説やエッセイでは三点リーダーを二つ重ねて書く作法がありますが、その一組で4字ぶんを使います。ダッシュを二つ重ねても2です。同じ「間を置く」記号で、消費が倍違います。
URLだけは実際の長さで数えない
Xでは、URLは見た目の長さに関係なく23字として数えられます。投稿されたURLがすべて同じ長さの短縮URLに置き換わるので、元の長さを数える意味がないからです。80字のURLを貼っても23しか減りませんし、逆に https://a.jp のような短いURLでも23取られます。Mastodonも同じく23で数えます。一方でBlueskyとThreadsは見えているとおりの長さで数えます。
ここまでを合わせると、「140字で切る」という素朴な実装がどこで壊れるかが見えます。日本語だけの原稿ならたまたま合いますが、URLを1本挟んだ瞬間に、Xでは23しか使っていないところを実際の長さぶん引いてしまいます。逆にBlueskyでは1字を1と数えるので、140で切ると上限300の半分も使いません。
手で数えてみる
「まえおき。」に短いURLを続けた一行をXで数えます。仮名5字は5 × 2 = 10、URLは長さに関係なく23。合わせて33です。上限280に対して、残りは247あります。同じ一行をBlueskyで数えると、仮名5と実際のURLの長さぶんになり、URLが40字なら45です。同じ文字列が、片方では33、片方では45になります。
SNS長文分割ツールは、投稿先を選ぶとこの数え方を切り替えて数え直します。切る位置も、書記素クラスタを最小単位にしているので絵文字の途中では切れません。
道具が多めに見積もっている場所
上の表で、家族の絵文字のXの重み付き字数を8と書きました。これは符号位置ごとに重みを足した数です。Xの実装には絵文字の連なりを1つの塊として扱う設定があり、それが効いていれば同じ絵文字は2と数えられます。どちらで数えているかは投稿画面で確かめるほかありません。
この道具は8のほうを採っています。多めに見積もるぶんには上限を超えないからです。字数の計算が外れたときの被害は左右で対称ではありません。少なく見積もれば投稿が弾かれるか末尾が切れますが、多く見積もっても1通が少し短くなるだけです。安全な向きが決まっている場面では、正確さより向きを優先します。
まとめ
字数は、文字を数えた結果ではなく、数え方を決めた結果です。投稿先が変われば数え方も変わります。連投を組む前に、自分の原稿が「どのものさしで」何字なのかを確かめてください。とくに三点リーダーと絵文字を多く使う書き手は、思っているより早く上限に届きます。