web-dev-qa-db-ja.com

VolleyリクエストのUTF-8エンコーディング

私のAndroidアプリでは、jsonデータをVolley JsonArrayRequestでロードしています。データは自分で作成し、SublimeでUTF-8エンコーディングで保存しました。 Responseを入力してListViewを入力すると、テキストが正しく表示されません(ウムラウト)。これは私のリクエストの外観です。

JsonArrayRequest request = new JsonArrayRequest(targetUrl,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(final JSONArray response) {
                        try {
                            fillList(response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        requestQueue.add(request);

この方法でまったく同じデータをロードすると、すべてのテキストが正しく表示されます。

final StringBuilder builder = new StringBuilder();
        final HttpClient client = new DefaultHttpClient();
        final HttpGet httpGet = new HttpGet(request);
        try {
            final HttpResponse response = client.execute(httpGet);
            final StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                final HttpEntity entity = response.getEntity();
                final InputStream content = entity.getContent();
                final BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
            } else {

            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

だから私には私のjsonファイルのエンコーディングに問題はないようです。 Volleyでこのエンコードの問題を修正するにはどうすればよいですか?

12
JensJensen

要求しているすべてのファイルがUTF-8形式であることがわかっている場合は、そうするように聞こえますが、Volley要求で強制的にUTF-8形式の文字列を返すことを検討してください。これは、標準のJSONリクエストをサブクラス化することで実現できます。このようなもの:

public class Utf8JsonRequest extends JsonRequest<JSONObject> {
    ...
    @Override
    protected Response<JSONObject> parseNetworkResponse (NetworkResponse response) {
        try {
            String utf8String = new String(response.data, "UTF-8");
            return Response.success(new JSONObject(utf8String), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            // log error
            return Response.error(new ParseError(e));
        } catch (JSONException e) {
            // log error
            return Response.error(new ParseError(e));
        }
    }
}
23
Matthew Pape

私はこのような同じ問題を抱えており、UTF-8文字セットを使用して解決します。

String str = "";
try {
     str = new String(strFromService.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {

 e.printStackTrace();
}

String decodedStr = Html.fromHtml(str).toString();

これがうまくいくことを願っています

このように実装できるのではなく、onResponseブロックでtry {}キャッチを使用しないでください。これにより、コードに問題が発生します。

@Override 
onResponse(String s) {

s= fixEncoding(s);
Toast.makeToast(this,s,Toast.LENGTH_LONG).show();

}

必要な結果が得られると思います

 public static String fixEncoding(String response) {
            try {
                byte[] u = response.toString().getBytes(
                        "ISO-8859-1");
                response = new String(u, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return null;
            }
            return response;
        }
8
erluxman

これは私にとって魅力的な働きをします。@ Muhammad Naeemの回答であるおかげで、静的メソッドを作成しました。

public static String fixEncodingUnicode(String response) {
    String str = "";
    try {
        str = new String(response.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();
    }

    String decodedStr = Html.fromHtml(str).toString();
    return  decodedStr;
}
5

Volleyの応答内に次のコード行を追加します。

 public void onResponse(String response) 
    {

     if (response != null) 
      {
        response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
      }
   }
4
Osama Ibrahim

別のアプローチ:このコード行で応答全体をエンコードできます。

newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");

ボレーのデフォルトのエンコード方法がiso8859-1であることを知っているので、応答文字列全体をUTF-8にエンコードしました

3
Milon

私は2日前に同じ問題を抱えていました。友達が言ったすべてのことを試しましたが、それは同じ問題であり、非常に卑劣なことを試みました。私のファイルはphpで記述されており、ボレーを使用してjsonとしてデータを取得します。問題を解決するためにこれらの手順に従いました。

  1. データベースでクエリを実行する前に、このクエリを書き込みます

    mysqli_query($ this-> connection、 "set_NAMES_utf8");

  2. pHPの場合、ファイルでこのヘッダーを使用します

    header( 'Content-Type:application/json; charset = utf-8');

  3. あなたがphpに従ってjsonをエコーし​​ている間、この問題の解決策がありますjson_encode($json,JSON_UNESCAPED_UNICODE)でこの特別な文字を使用してください

    それが役に立てば幸い

サーバーパーツで指定するには、「text/html; charset = utf-8」のようなコンテンツタイプにutf-8を設定します。

0