私の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でこのエンコードの問題を修正するにはどうすればよいですか?
要求しているすべてのファイルが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));
}
}
}
私はこのような同じ問題を抱えており、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;
}
これは私にとって魅力的な働きをします。@ 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;
}
Volleyの応答内に次のコード行を追加します。
public void onResponse(String response)
{
if (response != null)
{
response=new String(response.getBytes("ISO-8859-1"), "UTF-8");
}
}
別のアプローチ:このコード行で応答全体をエンコードできます。
newStr = URLDecoder.decode(URLEncoder.encode(oldStr, "iso8859-1"),"UTF-8");
ボレーのデフォルトのエンコード方法がiso8859-1であることを知っているので、応答文字列全体をUTF-8にエンコードしました
私は2日前に同じ問題を抱えていました。友達が言ったすべてのことを試しましたが、それは同じ問題であり、非常に卑劣なことを試みました。私のファイルはphpで記述されており、ボレーを使用してjsonとしてデータを取得します。問題を解決するためにこれらの手順に従いました。
データベースでクエリを実行する前に、このクエリを書き込みます
mysqli_query($ this-> connection、 "set_NAMES_utf8");
pHPの場合、ファイルでこのヘッダーを使用します
header( 'Content-Type:application/json; charset = utf-8');
あなたがphpに従ってjsonをエコーしている間、この問題の解決策がありますjson_encode($json,JSON_UNESCAPED_UNICODE)
でこの特別な文字を使用してください
それが役に立てば幸い
サーバーパーツで指定するには、「text/html; charset = utf-8」のようなコンテンツタイプにutf-8を設定します。