Как убедиться, что строка JSON имеет кодировку UTF-8 в Java - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над устаревшим кодом клиента веб-службы, в котором данные JSON отправляются в веб-службу. Недавно было обнаружено, что для некоторых запросов в теле JSON служба выдает ответ HTTP 400 из-за недопустимых символов (не UTF8) в теле JSON.

Ниже приведен один пример данные, которые вызывают проблему.

String value = "zu3z5eq tô‰U\f‹Á‹€z";

Я использую метод org.json.JSONObject.toString() для генерации строки JSON. Подскажите, пожалуйста, как я могу убедиться, что строка JSON имеет кодировку UTF-8?

Я уже пробовал несколько решений, таких как доступные онлайн, таких как преобразование в байтовый массив и затем обратно, используя java методы charset et c, но они не работают. Либо они преобразуют действительные значения так же, как китайские / японские символы, либо не работают вообще.

Не могли бы вы предоставить какую-то информацию по этому вопросу?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Вам необходимо установить кодировку символов для OutputStreamWriter при ее создании:

 httpConn.connect();
 wr = new OutputStreamWriter(httpConn.getOutputStream(), StandardCharsets.UTF_8); 
 wr.write(jsonObject.toString());
 wr.flush();

В противном случае по умолчанию используется «кодировка платформы по умолчанию», которая является некоторой кодировкой, которая исторически использовалась для текста файлы в любой системе, которую вы используете.

0 голосов
/ 08 апреля 2020

Используйте кодировку Base64 для преобразования значения в байт [].

  String value = "zu3z5eq tô‰U\f‹Á‹€z";

    // WHILE  SENDING  ENCODE THE VALUE
    byte[] encodedBytes = Base64.getEncoder().encode(value.getBytes("UTF-8"));
    String encodedValue = new String(encodedBytes, "UTF-8");

    // TRANSPORT....

    // ON RECEIVING END DECODE THE  VALUE
    byte[] decodedBytes = Base64.getDecoder().decode(encodedValue.getBytes("UTF-8"));
    System.out.println( new  String(decodedBytes, "UTF-8"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...