Get json, распознать русские символы

130
13 июля 2021, 22:30

Приведенный ниже код принимает json с сервера и выводит его в текстовое окно, если на сервере пишу возвращаемое содержимое русскими буквами, то в ответ приходят иероглифы, подскажите пожалуйста, в каком месте и как правильно мне указать кодировку для распознавания символов? В этом приложении происходит авторизация, после успешной авторизации получаю в ответ слово "Привет", но выводится ?????, как сделать так, чтобы вместо ????? у меня выводилось на экран слово привет? вот код MainActivity:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btn = (Button) findViewById(R.id.button1);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //тут указываем куда будем конектится
            new RequestTask().execute("myurl.com/login1.php");
        }
    });
}
class RequestTask extends AsyncTask<String, String, String> {
    @Override
    protected String doInBackground(String... params) {
        EditText login = (EditText) findViewById(R.id.editText1);
       // EditText pass = (EditText) findViewById(R.id.editText2);
        try {
            //создаем запрос на сервер
            DefaultHttpClient hc = new DefaultHttpClient();
            ResponseHandler<String> res = new BasicResponseHandler();
            //он у нас будет посылать post запрос
            HttpPost postMethod = new HttpPost(params[0]);
            //будем передавать два параметра
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
            //передаем параметры из наших текстбоксов
            //логин
            nameValuePairs.add(new BasicNameValuePair("login", login.getText().toString()));
            //пароль
          //  nameValuePairs.add(new BasicNameValuePair("pass", pass.getText().toString()));
            //собераем их вместе и посылаем на сервер
            postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            //получаем ответ от сервера
            String response = hc.execute(postMethod, res);
            //посылаем на вторую активность полученные параметры
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            //то что куда мы будем передавать и что, putExtra(куда, что);
            intent.putExtra(SecondActivity.JsonURL, response);
            startActivity(intent);
        } catch (Exception e) {
            System.out.println("Exp=" + e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        dialog.dismiss();
        super.onPostExecute(result);
    }
    @Override
    protected void onPreExecute() {
        ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        dialog.setMessage("Загружаюсь...");
        dialog.setIndeterminate(true);
        dialog.setCancelable(true);
        dialog.show();
        super.onPreExecute();
    }
}

}

Во второй активити он выводит текст который лежит на сервере

public class SecondActivity extends Activity {
public static String JsonURL;
private static ArrayList<HashMap<String, Object>> myBooks;
private static final String FIRST = "firstname";
public ListView listView;
/** @param result */
public void JSONURL(String result) {
    try {
        //создали читателя json объектов и отдали ему строку - result
        JSONObject json = new JSONObject(result);
        //дальше находим вход в наш json им является ключевое слово data
        JSONArray urls = json.getJSONArray("data");
        //проходим циклом по всем нашим параметрам
        for (int i = 0; i < urls.length(); i++) {
            HashMap<String, Object> hm;
            hm = new HashMap<String, Object>();
            //читаем что в себе хранит параметр firstname
            hm.put(FIRST, urls.getJSONObject(i).getString("firstName").toString());
            myBooks.add(hm);
            //дальше добавляем полученные параметры в наш адаптер
            SimpleAdapter adapter = new SimpleAdapter(SecondActivity.this, myBooks, R.layout.list,
                    new String[] { FIRST, }, new int[] { R.id.text1});
            //выводим в листвбю
            listView.setAdapter(adapter);
            listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.url);
    listView = (ListView) findViewById(R.id.list);
    myBooks = new ArrayList<HashMap<String, Object>>();
    //принимаем параметр который мы послылали в manActivity
    Bundle extras = getIntent().getExtras();
    //превращаем в тип стринг для парсинга
    String json = extras.getString(JsonURL);
    //передаем в метод парсинга
    JSONURL(json);
}

}

Answer 1

Кодировка нужна чтобы преобразовать массив байтов в строку. Так что она нужна на уровень выше (в месте где ты принимаешь json от сервера). Строчка подаваемая на твой метод уже должна содержать валидные русские буквы в правильной кодировке.

READ ALSO
Как получить массив до определённого количества?

Как получить массив до определённого количества?

Как от сюда вытащить первые 5 имён? Остальные не нужны

112
Оптимизация SPA приложения

Оптимизация SPA приложения

Всем приветРазработал SPA приложение

91
JS Получение данных из спарсеного javascript

JS Получение данных из спарсеного javascript

нашлась довольно интересная задача, пишу расширение для google chrome и столкнулся с проблемой, когда мне требуется из спарсеного <script type="text/javascript">...

114