Символы в контенте принимаются сервером, как показано ниже. Когда я запускаю тот же код в 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);
}
Я не упоминал, что у моего кода есть проблема, я говорю, что код библиотеки Gson может неправильно обрабатывать кодировку символов на разных платформах. Я не совсем уверен, есть ли способ установить параметр кодировки символов для GsonBuilder при вызове toJson ()
Вы знаете кодировку файлов, которую ваш jvm использует в Windows и OSX? Возможно, что для каждого из них используются разные значения по умолчанию. При вызове RequestBody.create вы должны явно указать тип кодировки, которую вы используете. Пример: позвоните в RequestBody.create(JSON, gson.getBytes(StandardCharsets.UTF_8));
Я действительно не уверен, какая кодировка файлов используется jvm на каждой из этих платформ, моя машина Windows - это Windows Server 2008 R2, я попробую использовать приведенный выше код и проверю, может ли он это исправить.
Попробуйте и посмотрите, что произойдет, если вы напечатаете content вместо response_string.
Я печатаю его сразу после вызова toJson (), и он распечатывает его как ??????????. Я попробовал предложение @RickRidley, но теперь оно выглядит как ?????????? к серверу.
@RickRidley кодировка испортилась сразу после вызова toJson () GsonBuilder, поэтому установка ее в RequestBody, как это было предложено, не помогает решить эту проблему.




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