val().lengthでは正確にはカウントできない
Twitterの投稿には140文字までの制限があります。
よくTwitterのAPIを利用した投稿アプリで文字数のカウント機能を
実装することがあると思いますが、単純に
$('#twt').val().length()
のようにカウントすると、おかしくなるときがあります
Twitterでは、URLは必ず短縮される
まず、Twitterでは投稿中のURLは全てTwitter独自の短縮URLの仕組みであるt.coで短縮されるため
URLの長さに限らず文字数は、
http: 23文字
https: 22文字
と決まっている。
以下のような文章は、
ヤフー http://yahoo.co.jp
普通にカウントすれば、22文字だがTwitterだと29文字になる。
一部文字のカウント数も異なる
これは検証したのが、かなり前なので詳しくは覚えていないのですが、
一部の特殊な文字(サロゲートペア)に対する扱いも、
val().length
と Twitterの文字数カウントの方法は違うらしい
(詳しい人いたら教えていただけるとありがたいです)
公式のライブラリを探す
そこで、Twitterの文字数カウントと同じ方法で計算するためのライブラリがあるか探したらありました。
PHP,Java,Ruby,Python,JS用のライブラリが用意されているようです。
ただ自分が普段利用しているPHPのためのライブラリは、
短縮URLを展開するものであったり投稿からハッシュタグのみ抽出するものであったりして、
直接文字数をカウントする関数というものが無いです。
フォーク先のライブラリを使う
そこで根気よく探したら、
日本人の方がフォークして使いやすい関数を実装してくれていました
それがこのライブラリ
ライセンスはApache License v2.0
使い方
Twitter_Validation.phpをインポートする
include_once('Twitter_Validation.php');
インスタンスを作成
$validator = Twitter_Validation::create('', array(
'short_url_length' => 22,
'short_url_length_https' => 23,
));
getTweetLengthを呼び出す
$twitter_count = $validator->getTweetLength($message);
これだけ。
TwitterのAPIを使ったアプリを作ってみようという方は、
一度ぜひ使ってみてください。