Twitterの最大文字数と最大バイト数の関係を調べてみた

つい最近、Twitterボットもどきを作ってました。

その時、ふとこんなことが気になったんです。

最大文字数と最大バイト数ってどういう関係あるんだろ?

ものすごく気になったので、色々調べてみました。

まず文字数カウントの基本ルールについて

まず Twitter での文字数カウントのルールについて

従来までだと、英語圏とかは最大140字まででした。

 

でも2017年にこのルールは廃止、代わりに280字までOKになった訳です。

米Twitterは11月8日(日本時間)、英語などの言語で、ツイートできる文字数の上限を140文字から280文字に拡大した。日本語は対象外で、140文字制限のままだが、半角英数字や半角記号を含む場合、その部分は「1文字」ではなく「0.5文字」とカウントされるようになった。このため、日本語ツイートでも半角英数字を含む場合は、従来よりも多い文字数で投稿できる。

文字数制限の緩和は、英語やドイツ語など、日本語、中国語、韓国語を除く言語が対象。140文字から280文字に拡大した。

引用元 : Twitter、日本語ツイートでも英数字は「0.5文字分」に 残り文字数表示も変更

▲ツイート制限が280字に拡大されたときの記事

この記事でも書いてあるけど、特に注目すべきは次の3つのポイント

  • 全角(日本語)だと140字制限は変わらず
  • 半角(英語とか)のみ280字に拡大された
  • 全角1文字 = 半角2文字 でカウント

これが基本的なルール

 

このルールをそのまま受け取ると、

「日本語1文字で半角2文字分か・・・」
「なら半角1文字1バイトだから最大280バイトってことでOK?」

うん、実を言うと僕もそう思い込んでました、でも 大間違い です。

でも文字数だと簡単だけど、バイト数だとかなり複雑な問題になるみたいです。

ツイート文字数とバイト数の関係はこういう感じ

ツイートの最大バイト数、これは次の3パターンに分けて考える必要あり

  • 全角(日本語)だけの場合
  • 半角英数字だけの場合
  • 半角・全角入り混じる場合

この3パターンで、最大バイト数は次みたいに計算できます。

1.ツイートが全角(日本語)だけの最大バイト数

まず日本語とかのマルチバイト文字を使った場合、UTF-8形式 でツイートを記録してます

▼実際 Twitterヘルプ でもこういう風に書いてる

All Twitter attributes accept UTF-8 encoded text via the API. All other encodings must be converted to UTF-8 before sending them to Twitter in order to guarantee that the data is not corrupted.

引用元 : Counting Characters - Twitter Developer

▼この説明を超意訳するとこういう感じ

全てのTwitter的な要素はAPI経由でUTF-8エンコードされたテキストを受け取るよ。データが壊れるかもしれないから、UTF-8じゃないテキストは Twitter に送る前にUTF-8に変換しといてね。

つまり、普段見てるツイートは全部 UTF-8 ってことです。(Twitter以外でもほとんどそうだけど)

 

なので 日本語1文字は UTF-8 だと 3バイト になり、
そして 日本語の最大文字数は 140字 です。

つまり最大バイト数は 140 × 3 = 420バイト

バイト数にすると日本語はかなりバイト数使ってるんですね、、、

日本語・中国語・韓国語とかが140字までなのは、こういうデータ量的な事情があるのかも

2.ツイートが半角英数字だけの最大バイト数

これは計算するまでのなくすぐわかります。

半角英数字はUTF-8だろうが何だろうが、1文字1バイト、
そして半角だけの最大文字数は280字まで

つまり半角のみの最大バイト数は 280バイト 

実は英語より短い日本語の方が、バイト数的には消費してます。

3.ツイートが日本語と半角ごちゃ混ぜの最大バイト数

厄介なのは、全角・半角が混ざってる時

さっきも説明したみたいに、文字数カウントのルールは、

  • 全角1文字 = 半角2文字分
  • 日本語は140文字まで、半角は280字まで

こういうルールでした。

 

これを踏まえると、バイト数は次のように考えることが可能

  • 最小 : 281バイト
    1文字だけ全角(=3byte)でそれ以外が半角(=278byte)の場合
  • 最大 : 418バイト
    1文字だけ半角(=1byte)でそれ以外が全角(=3*139 = 417bytes)の場合

含まれる半角・全角の文字数によって変わります。

 

つまり最大バイト数は・・・

大体 281バイト ~ 418バイト までのあいだ

半角・全角が含まれれてると、「最大バイト数はコレ!」とは断言できません。

最大バイト数についてのまとめ

ということで、ツイートの最大バイト数まとめ

  • ツイートが日本語のみの場合
    日本語1文字はUTF-8だと3バイトなので、3 × 140 = 420バイト
  • ツイートが半角文字だけの場合
    半角英数字は1文字1バイトなので、1 × 280 = 280バイト
  • ツイートが全角・半角混じってる場合
    最大バイト数は断言できない。大体 281バイト ~ 418バイト までのあいだ

バイト数で考えると、かなりメンドクサイ・・・

Twitter API を使うときはバイト数で考えない方がいい

こっからは完全に蛇足パート

今解説したみたいに、ツイートはバイト数で考えるとスゴク複雑です。

なのでもし Twitter API とかを使ってるなら、
ツイート投稿はバイト数より、文字数で考えた方が楽だと思います

 

例えばTwitterボットを作りたいなら、Twitter OAuth を使うこと多いです。

以下PHPで自動ツイートしてるコード例

こういう自動投稿をしたいとき、バイト数で数えるとドツボにハマります。

だって日本語2バイト、半角1バイトみたいな考え方ができないので

 

なのでもし「ツイートの全角とか半角に関係なく、最大文字数でツイートしたい」・・・みたいな場合は半角基準で文字数をカウントするのがベスト!

ちなみにPHPの場合、 mb_strwidth  関数を使えば、
半角を1文字で、全角を2文字分としてカウントできてものすごく便利です。

これを使うと、半角・全角が入り混じったツイートでも対応可能

ついでにいうと、 strlen  関数は単純にバイト数を返すだけ、
それから mb_strlen  関数は半角・全角関わらず1文字とカウントしてしまうので注意!

Twitterの特殊ルールに合わせるなら、 mb_strwidth  を使うのが確実です。

 

以上、Twitterでの最大文字数と最大バイト数の関係についてでした。

もし間違いがあるなら、コメント欄でご指摘ください。