つい最近、Twitterボットもどきを作ってました。
その時、ふとこんなことが気になったんです。
「最大文字数と最大バイト数ってどういう関係あるんだろ?」
ものすごく気になったので、色々調べてみました。
このページの目次
まず文字数カウントの基本ルールについて
まず Twitter での文字数カウントのルールについて
従来までだと、英語圏とかは最大140字まででした。
でも2017年にこのルールは廃止、代わりに280字までOKになった訳です。
米Twitterは11月8日(日本時間)、英語などの言語で、ツイートできる文字数の上限を140文字から280文字に拡大した。日本語は対象外で、140文字制限のままだが、半角英数字や半角記号を含む場合、その部分は「1文字」ではなく「0.5文字」とカウントされるようになった。このため、日本語ツイートでも半角英数字を含む場合は、従来よりも多い文字数で投稿できる。
文字数制限の緩和は、英語やドイツ語など、日本語、中国語、韓国語を除く言語が対象。140文字から280文字に拡大した。
▲ツイート制限が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.
▼この説明を超意訳するとこういう感じ
全ての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で自動ツイートしてるコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$CK = 'xxxxxxxxxx'; /// Consumer API Key $CS = 'xxxxxxxxxx'; /// Consumer API Secret $AT = 'xxxxxxxxxx'; /// Access Token $AS = 'xxxxxxxxxx'; /// Access Token Secret $bot = new TwitterOAuth( $CK, $CS, $AT, $AS ); $tweet = 'ボットからの初ツイート'; $bot->post( 'statuses/update', array( 'status' => $tweet ) ); |
こういう自動投稿をしたいとき、バイト数で数えるとドツボにハマります。
だって日本語2バイト、半角1バイトみたいな考え方ができないので
なのでもし「ツイートの全角とか半角に関係なく、最大文字数でツイートしたい」・・・みたいな場合は半角基準で文字数をカウントするのがベスト!
ちなみにPHPの場合、
mb_strwidth 関数を使えば、
半角を1文字で、全角を2文字分としてカウントできてものすごく便利です。
これを使うと、半角・全角が入り混じったツイートでも対応可能
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/// 例えば最大文字数でつぶやきたいなら... $tweet = ''; while ( mb_strwidth($tweet, 'UTF-8') <= 280 ) { $tweet .= 'あa'; } /// ツイート $bot->post( 'statuses/update', array( 'status' => $tweet ) ); |
ついでにいうと、
strlen 関数は単純にバイト数を返すだけ、
それから
mb_strlen 関数は半角・全角関わらず1文字とカウントしてしまうので注意!
Twitterの特殊ルールに合わせるなら、 mb_strwidth を使うのが確実です。
以上、Twitterでの最大文字数と最大バイト数の関係についてでした。
もし間違いがあるなら、コメント欄でご指摘ください。