Help us understand the problem. What is going on with this article?

UnityのLet's Tweet in Unityを用いた画像ツイート

More than 3 years have passed since last update.

Unityで画像付きツイートを行いましょう。
iOSとAndroidについては、SocialConnectorを使っちゃえということで、Windows版をどうするかです。
Let's Tweet in Unityを使うのが簡単そうだったのですが、画像付きのツイートが出来ないので、情報を探していたらこちらのサイトにヒットしました。

タイトルがあちらのサイトのまんまなのですが、あちらのサイトの情報では不完全だったので、補足する意味であえて同じタイトルにしました。

さて、あちらのサイトの回答欄に、画像付きツイート用メソッドが書かれているので、そのままコピペして使えば良いのですが、実行してみると回答に書かれているとおり、「UriFormatException:Uri is longer than the maximum {0} characters.」というエラーが出ます。
さらにその解決法として「画像をjpgからpngに変えたらいけた」という書き込みがあるのですが、その解決方法は間違っており、この記事はその修正となります。

エラーの内容的には、Uri.EscapeDataStringに渡した文字列が長すぎるのが原因です。
画像をjpgからpngに変えて上手くいったのは、たまたまファイルサイズが小さくなって、文字列長が最大値に収まったからでしょう。
当然pngでもサイズが増えれば同じエラーが出ると思います。

エラーの場所はTwitter.csのUrlEncode(string value)内にあります。
value = Uri.EscapeDataString(value);なんですが、このメソッドが32766文字までしか変換ができません。
そこで、渡された文字列が32766文字以上だった場合は、文字列を分割しながら変換をかけてやることにします。

#if false
    value = Uri.EscapeDataString(value);
#else
    var result = "";
    int len;
    while ((len = value.Length) != 0)
    {
        var nowLen = (value.Length > 32766) ? 32766 : value.Length;
        result += Uri.EscapeDataString(value.Substring(0, nowLen));
        value = value.Substring(nowLen);
    }
    value = result;
#endif

ちなみにEscapeDataStringは.NETの4.0以降と以前で挙動が変わる場合があります。
よって、その下にあるエスケープ処理も念のため残しておきます。
詳しくはこちらのサイトにて。

これで晴れてWindowsでも画像付きツイートが行えるようになりました。
MacやLinux上では動くのかな?(5月6日追記:Mac上でも正常に動作しました)
機会があれば試してみたいと思います。

あちらのサイトに書き込みが行えれば良かったのですが、わざわざこのために向こうのサイトにユーザー登録するのも面倒なので、こちらに書きました。
すみません。
というか、アセット作者が対応してくれれば良いのになぁ。

t_hoshiyama
初めまして、有限会社ぴっくるの代表の星山です。 ゲーム業界で25年ほど働いています。 傭兵エンジニアとして、知見(バッドノウハウ)は山ほど溜まっているのですが、それをまとめてアウトプットする時間がなく、これではいけないと思い、なるべく記事にしていこうと思っています。 どうぞよろしくお願いします。 ぴっくる公式ページ:https://pickle.ne.jp
http://pickle.ne.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away