GsonBuilder toJSon () неправильно кодирует неанглийский набор символов

Символы в контенте принимаются сервером, как показано ниже. Когда я запускаю тот же код в Mac OSX, все идет так, как ожидалось, но когда та же программа запускается на компьютере с Windows, я получаю такое поведение, нет проблем с серверным кодом, потому что, когда я вызываю этот API из Postman и передаю эти символы, то они принимаются сервером правильно. Похоже, у GsonBuilder есть проблемы с обработкой неанглийских символов. Я сталкиваюсь с этой проблемой и с несколькими другими языками.

Εισιτή�?ια

        private String content =  "Εισιτήρια";

        public String post(String targetEnvironment) throws IOException{

        String gson = new GsonBuilder().disableHtmlEscaping().excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT).setLenient().create().toJson(this).toString();
            System.out.println(gson);
            OkHttpClient client = new OkHttpClient();

            MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody body = RequestBody.create(JSON, gson);
            Request request = new Request.Builder()
              .url(targetEnvironment)
              .post(body)
              .addHeader("content-type", "application/json; charset=utf-8")
              .addHeader("accept", "application/json")
              .addHeader("client_application_id", "1")
              .addHeader("x-requested-with", "1")
              .addHeader("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5)")
              .addHeader("accept-encoding", "gzip,deflate,br")
              .addHeader("cache-control", "no-cache")
              .build();

            Response response = client.newCall(request).execute();

            String response_string = response.body().string();
            System.out.println(response_string);
         }

Вы говорите, что он работает на Mac, но также подозреваете, что в коде есть проблемы. Вы хотите сказать, что код не зависит от платформы?

Bhesh Gurung 25.04.2018 22:31

Я не упоминал, что у моего кода есть проблема, я говорю, что код библиотеки Gson может неправильно обрабатывать кодировку символов на разных платформах. Я не совсем уверен, есть ли способ установить параметр кодировки символов для GsonBuilder при вызове toJson ()

user1614862 25.04.2018 22:49

Вы знаете кодировку файлов, которую ваш jvm использует в Windows и OSX? Возможно, что для каждого из них используются разные значения по умолчанию. При вызове RequestBody.create вы должны явно указать тип кодировки, которую вы используете. Пример: позвоните в RequestBody.create(JSON, gson.getBytes(StandardCharsets.UTF_8));

Rick Ridley 25.04.2018 23:40

Я действительно не уверен, какая кодировка файлов используется jvm на каждой из этих платформ, моя машина Windows - это Windows Server 2008 R2, я попробую использовать приведенный выше код и проверю, может ли он это исправить.

user1614862 26.04.2018 00:04

Попробуйте и посмотрите, что произойдет, если вы напечатаете content вместо response_string.

Bhesh Gurung 26.04.2018 01:00

Я печатаю его сразу после вызова toJson (), и он распечатывает его как ??????????. Я попробовал предложение @RickRidley, но теперь оно выглядит как ?????????? к серверу.

user1614862 26.04.2018 01:03

@RickRidley кодировка испортилась сразу после вызова toJson () GsonBuilder, поэтому установка ее в RequestBody, как это было предложено, не помогает решить эту проблему.

user1614862 26.04.2018 02:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
113
0

Другие вопросы по теме