ダウンローダーなのに調子に乗ってアップロードできたりツイートできたりで
方向性が定まらなくなっている拙作について。
【20110708】 TwitPic からの画像一括ダウンロード&アップロード【TwitPicDLer】
http://doutor-pg.cocolog-nifty.com/blog/2011/07/20110708-twitpi.html
0.3.1で対応し,0.3.2で修正したコメント付き画像投稿で詰まったことについて
メモ書き代わりに残しておこうと思います。
当初は Twitpic に投げる情報すべてを ISO-8859-1 でエンコードしていました。
テストしているときの文字列は test とかでしかなかったのでこれで問題なかったのです。
で,いざ日本語を送ってウェブサイトを確認すると見事に文字化け。
これはいかんと今度は UTF-8 でエンコードしたら文字化けはなくなったのですが
代わりに jpg 画像がビデオファイルとして認識されるという意味の分からない状態に。
コードはこんな感じ。
StringBuilder post = new StringBuilder();
// メッセージ
post.AppendLine(header); // ヘッダ情報
post.AppendLine("Content-Disposition: form-data; name=\"message\"");
post.AppendLine();
post.AppendLine(postMessage);
post.AppendLine();
// イメージファイル
post.AppendLine(header);
string fileHeader = string.Format("Content-Disposition: file; name=\"media\";filename=\" + imageFile + \""); // ファイル名
Encoding enc = Encoding.GetEncoding("iso-8859-1");
string fileData = enc.GetString(image); // byte 配列の画像データ
post.AppendLine(fileHeader); // ファイルヘッダ
post.AppendLine("Content-Type: " + Fileype); // アップするファイルタイプ
post.AppendLine();
post.AppendLine(fileData);
post.AppendLine();
byte[] bytes = enc.GetBytes(post.ToString());
webRequest.ContentLength = bytes.Length;
Stream requestWriter = webRequest.GetRequestStream();
requestWriter.Write(bytes, 0, bytes.Length);
これだと post データ全体が ISO-8859-1 でエンコードされるので,
当然ですが日本語が文字化けしてしまうわけです。
ではどうするか。
結論としては,美しさの欠片もない方法ですが文字列と画像とで別個の
byte 配列とし、後に結合するという手段です。
// メッセージ
post.AppendLine(header); // ヘッダ情報
post.AppendLine("Content-Disposition: form-data; name=\"message\"");
post.AppendLine();
post.AppendLine(postMessage);
post.AppendLine();
byte[] bytes1 = Encoding.UTF8.GetBytes(post.ToString());
// イメージファイル
post.AppendLine(header);
string fileHeader = string.Format("Content-Disposition: file; name=\"media\";filename=\" + imageFile + \""); // ファイル名
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("iso-8859-1");
string fileData = enc.GetString(image); // byte 配列の画像データ
post.AppendLine(fileHeader); // ファイルヘッダ
post.AppendLine("Content-Type: " + Fileype); // アップするファイルタイプ
post.AppendLine();
post.AppendLine(fileData);
post.AppendLine();
byte[] bytes2 = enc.GetBytes(post.ToString());
webRequest.ContentLength = bytes.Length + bytes2.Length;
Stream requestWriter = webRequest.GetRequestStream();
requestWriter.Write(bytes1, 0, bytes.Length);
requestWriter.Write(bytes2, 0, bytes.Length);
…我ながらひどい。
ひどいけれど,他に手段が思い浮かばないのも事実なのです。
一先ずこれでうまくいきましたが,何か良い手段があれば変えたいところ。
なんで他のクライアントは問題ないのだろう…