Android-приложение расшифровывает ответ JSON из базы данных PHP MySql без специальных символов

Я пытаюсь получить некоторые данные из моей database в моем android app , но некоторые специальные символы отправляются неправильно. Данные на самом деле сначала отправляются из моего приложения, сохраняются, а затем извлекаются. Когда я отправляю их, данные регистрируются корректно, но когда дело доходит до извлечения, кажется, что есть проблема с кодированием / декодированием. Для правильного хранения данных я использовал mysqli_set_charset($conn, 'utf8'); команда, поэтому данные Situație 4 сохраняются так, как они были отправлены. PHP-код для отправки данных:

$stmt->bind_result($id, $latitudine, $longitudine, $tip_problema, $data_ora, $ora_catalogare, $validare, $grad_incredere);
                while($stmt->fetch()) {
                    $locatie[] = array (
                            "id_alerta"=>$id,
                            "latitudine"=>$latitudine, 
                            "longitudine"=>$longitudine, 
                            "tip_problema"=>$tip_problema,
                            "data_ora"=>$data_ora,
                            "ora_catalogare"=>$ora_catalogare,
                            "stare_problema"=>$validare,
                            "grad_incredere"=>$grad_incredere
                            );
            $response['error'] = false; 
            $response['message'] = 'Alerte reimprospatate'
            $response['locatie']= $locatie;
                } 

Необходимая информация хранится в $ locatie, поэтому я могу получить ответ JSON в своем приложении.

Код приложения, интерпретирующий ответ JSON:

@Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //hiding the progressbar after completion

            try {
                //converting response to json object
                JSONObject obj = new JSONObject(s);

                //if no error in response
                if (!obj.getBoolean("error")) {
                    Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();

                    JSONArray locatieArray = obj.getJSONArray("locatie");
                    for (int i = 0; i < locatieArray.length(); i++) {
                        JSONObject locatie = locatieArray.getJSONObject(i);
                        // check latitudine and longitudine is not null and if not null then cast these values and call the addMarker() method.
                        if (!locatie.isNull("latitudine") && !locatie.isNull("longitudine")) {
                            latitudine_sql = Double.valueOf(locatie.getString("latitudine"));
                            longitudine_sql = Double.valueOf(locatie.getString("longitudine"));
                            tip_problema_sql = locatie.getString("tip_problema");
                            id = locatie.getString("id_alerta");
                            data_ora_raportare = locatie.getString("data_ora");
                            stare_alarma = locatie.getString("stare_problema");
                            data_ora_ack = locatie.getString("ora_catalogare");
                            grad_incredere = locatie.getString("grad_incredere");
                            addMarker(latitudine_sql, longitudine_sql);

                        }
                    }

                } else {
                    Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

Здесь начинается сложная часть. Ответ JSON выглядит так:

{
"error": false,
"message": "Alerte reimprospatate",
"locatie": [{
    "id_alerta": 43,
    "latitudine": "37.41593630609526",
    "longitudine": "-122.09065474569798",
    "tip_problema": "Situau021bie 4",
    "data_ora": "2020-01-14 15:44:37",
    "ora_catalogare": null,
    "stare_problema": "Nevalidat",
    "grad_incredere": 65.75
}]

}

Несмотря на то, что в базе данных в столбце Situație 4 сохранена Situație 4 , при Situație 4 в приложение она преобразуется в Situau021bie 4 .

Для установления соединения я использую RequestHandler :

public class RequestHandler {
public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams) {
    URL url;

    StringBuilder sb = new StringBuilder();
    try {
        url = new URL(requestURL);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(15000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);

        OutputStream os = conn.getOutputStream();

        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getPostDataString(postDataParams));

        writer.flush();
        writer.close();
        os.close();
        int responseCode = conn.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK) {

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            sb = new StringBuilder();
            String response;

            while ((response = br.readLine()) != null) {
                sb.append(response);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return sb.toString();
}

private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for (Map.Entry<String, String> entry : params.entrySet()) {
        if (first)
            first = false;
        else
            result.append("&");
        result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
    }
    return result.toString();
}

}

Где я везде установил UTF-8 collation . Любой совет будет очень признателен! ОБНОВЛЕНИЕ: я добавил UTF-8 в BufferReader на InputStream но ответ тот же. BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

ОБНОВЛЕНИЕ: После переустановки приложения, даже несмотря на то, что ответ тот же, Situau021bie 4 приложение, похоже, понимает, что сообщение относится к Situație 4 поэтому теперь оно работает правильно.

Всего 1 ответ


Пожалуйста, попробуйте дать кодирование BufferedReader

 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

Есть идеи?

10000