メインコンテンツへスキップ
このページでは、Tweetの作成時およびX API全体における文字の扱いについて説明します。実装に関する詳細は、Xが提供するオープンソースのtwitter-textライブラリを参照してください。GitHubで公開されています。

背景

X は SMS ベースのサービスとして始まりました。これにより、当初の Tweet の文字数は 140 に制限されていました(SMS の上限である 160 文字のうち、20 文字をコマンドやユーザー名に割り当てていたため)。その後 X の進化に伴い、最大 Tweet 文字数は 280 に拡大されました。依然として短く簡潔ながら、より豊かな表現が可能になりました。

文字の定義

多くの場合、Tweet のテキスト内容は最大 280 文字または Unicode のグリフを含められます。グリフによっては複数文字として数えられるものがあります。 あるグリフが 1 文字または複数文字として数えられるかを、そのグリフの重みと呼びます。どの文字が 1 より大きい重みを持つかの正確な定義は、twitter-text の Tweet 解析ライブラリ構成ファイルに記載されています。 現在の構成ファイルのバージョンでは、既定の「2 文字分の重み」と、異なる重み付けが適用される 4 つのUnicode コードポイント範囲を定義しています。現時点では、これらの範囲に含まれるコードポイントはすべて 1 文字として数えられます。
  • 最初の範囲は Latin-1 コードページ全体を対象とします (U+0000 - U+10FF)。
  • 2 番目の範囲は、Zero Width Joiner(絵文字や他のグリフを結合するために使用)までを含む一般的な句読点です (U+2000-U+200D)。
  • 3 番目の範囲は、Unicode の方向マークである U+200E と U+200F を除く一般的な句読点です (U+2010-U+201F)。
  • 最後の範囲は引用符を対象とします (U+2032-U+2037)。
twitter-text ライブラリで計算された Tweet テキストとその長さの例は、ライブラリのテスト構成ファイル validate.yml にあります。
表示される文字長さ説明Unicode シーケンス
a1ラテン小文字 aU+0061
á1ラテン小文字 a(アキュート付き)U+00E1
ӑ1キリル小文字 a(ブレーブ付き)U+04D1
1ラテン小文字 o(サーカムフレックスとアキュート付き)U+1ED2

絵文字

twemoji がサポートする絵文字は、結合修飾子の有無にかかわらず常に2文字として数えられます。これには、Fitzpatrick 肌の色性別修飾子 で変更された絵文字も含まれ、Unicode のコードポイント数が大幅に多い場合でも同様です。絵文字の重みは、標準的な絵文字と1つ以上の Unicode のゼロ幅接合子(U+200D)の組み合わせからなるシーケンスを検出する twitter-text の正規表現によって定義されています。
表示される絵文字長さ説明Unicode シーケンス
👾2既知の絵文字のデフォルトの長さ
🙋🏽2肌の色修飾子付きの絵文字🙋 U+1F64B, 🏽 U+1F3FD
👨‍🎤2合成グリフ(ゼロ幅接合子)を使用する絵文字シーケンス👨 U+1F468, U+200D, 🎤 U+1F3A4
👨‍👩‍👧‍👦2複数の合成グリフ(ゼロ幅接合子)を使用する絵文字シーケンス👨 U+1F468, U+200D, 👩 U+1F469, U+200D, 👧 U+1F467, U+200D, 👦 U+1F466

中国語 / 日本語 / 韓国語のグリフ

CJK(中国語 / 日本語 / 韓国語)で使用されるグリフは、2文字分としてカウントされます。したがって、CJKのテキストのみで構成されたTweetは、これらのグリフを最大140個まで含められます。

エンティティオブジェクト

Tweet には エンティティオブジェクト が含まれる場合があり、その一部は Tweet の文字数に影響します。 URL: すべての URL は t.co リンクに変換されます。これは、URL の長さが twitter-text の設定ファイルtransformedURLLength パラメータで定義されることを意味します。Tweet 内の URL の現在の長さは 23 文字で、通常の URL がそれより短い場合でも同じです。 返信: 返信 Tweet の先頭に自動入力される @name は文字数制限にカウントされません。新規の非返信 Tweet が @メンションで始まる場合はカウントされ、ユーザーが Tweet の本文に明示的に追加した @メンションもカウントされます。 メディア: 公式クライアントから投稿された場合、pic.x.com の URL として表される Tweet 添付メディアは、文字数 0 として扱われます。 エンティティオブジェクトの詳細は、開発者向けドキュメントをご覧ください。

X の文字エンコーディング

X API のエンドポイントは UTF-8 でエンコードされたテキストのみを受け付けます。その他のエンコーディングは、テキストを API に送信する前に UTF-8 に変換する必要があります。 X は、Tweet の長さをテキストの NFC(Normalization Form C)に正規化した上で計測します。 例として「café」という語を考えます。見た目も読み方も同じでも、使用するバイト数が異なる 2 つのバイト列が存在します。
café0x63 0x61 0x66 0xC3 0xA9「é」文字(合成済み文字)を使用
café0x63 0x61 0x66 0x65 0xCC 0x81合成用ダイアクリティカルマークを使用し、「e」に重ねる
Normalization Form C は、長い表現(0x65 0xCC 0x81)よりも、完全に結合された文字(café の例の 0xC3 0xA9)の使用を優先します。 X は、UTF-8 のバイト数ではなくテキスト中のコードポイント数をカウントします。café の例の 0xC3 0xA9 は 1 つのコードポイント(U+00E9)で、UTF-8 では 2 バイトとしてエンコードされます。一方、0x65 0xCC 0x81 は 2 つのコードポイントで、3 バイトとしてエンコードされます。