tmytのらくがき

個人の日記レベルです

どうやって140文字数える?

掲題の通り。雪猫さんがそんな話をしてたので書いてみました。

さてどうやって140文字を数えよう。140文字を数えるのは意外と大変で、考慮しないといけないことを軽くあげると

  • CRLFが2文字に見えるけど1文字として数える
  • サロゲートペアを含む文字が2文字に見えるけどこっちも1文字として数える
  • URLは22文字にする
  • でもHTTPSは23文字にする
  • しかも画像を添付すると枚数にかかわらず23文字として数える
  • かといってユーザ名とパスワードを含むURLはそのまま数える
  • さらに"."を2個以上含むccTLDはスキームがなくても22文字として数える
  • ところがgTLDの場合は"."を1個以上含む場合22文字とする

などなど。他にもいっぱいあって非常にめんどくさいです。

そこでとりあえず諦めてこれをつかいます。

考えたくないいろいろをいい感じにしてくれる凄いやつです。

これを使って140文字を数えたコードがこちら。

public static int TweetLength(this string s)
{
    var validator = new Validator();
    return validator.GetTweetLength(s) - CountCrLf(s);
}

private static int CountCrLf(string s)
{
    int n = 0, p = -2;
    while ((p = s.IndexOf("\r\n", p + 2)) >= 0) n++;
    return n;
}

CRLFを2文字として数えてしまう問題は残っているので、CRLFを探してその分減らしてつじつま合わせ。たぶん大丈夫なはず。