0
Help us understand the problem. What are the problem?

posted at

updated at

Android6.0 ApacheHTTPClientからURLConnectionへの置き換え

自分が失敗したならあと10人は失敗しているだろう(ゴキブリ理論)
タイトル対応中にmultipartで詰まった、ということで失敗備忘録です。

multipartでテキストと画像データをPost

以下を参考に実装

問題発生

サーバーへテキストと画像を送信できた。がしかし、テキスト内の日本語が文字化けしている。
1.日本語以外(英字/数字)は文字化けなし。
2.画像は壊れることなく送信できている。

原因

DataOutputStreamへの書き込みを直接writeBytesで実装しているため、
AndroidOS標準の文字コード(UTF-8以外のなにか(未調査))でエンコードされていた。

対応

writeBytesは使用せず、一度StringBuilderであつめてからByte変換するようにした。

RestUtility.java
// 以下内容は参考元より多少の改変をしています
final String BOUNDARY=  "**BOUNDARY**";
final String lineEnd = "\r\n";

DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
StringBuilder builder = new StringBuilder();

// 一度StringBuilderに格納し
builder.append("--").append(BOUNDARY).append(lineEnd);
builder.append("Content-Disposition: form-data;name=\"").append(entry.getKey()).append("\"").append(lineEnd);
builder.append("Content-Type: text/plain; charset=UTF-8").append(lineEnd);
builder.append("Content-Transfer-Encoding: 8bit").append(lineEnd);
builder.append(lineEnd);
builder.append(entry.getValue());
builder.append(lineEnd);

// UTF-8を指定してByte変換(DataOutputStreamの関数を使用しない)
outputStream.write(builder.toString().getBytes(StandardCharsets.UTF_8));

あとがき

気づいてみればごくごく普通のことだった。
文字コードが絡んだならば、厳戒態勢を敷こう!!!!!

オイオイオイオイ!!
もっといい書き方があるぜぇ!!!!!

というとき、すみませんがコメントにてご指摘ください。

参考

Apache HTTP Client の削除

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?