Проблема кодирования с использованием Microsoft Graph API и ArduinoJSON для анализа - PullRequest
0 голосов
/ 11 февраля 2019

Я строю дверной знак для комнат нашей компании, который подключается к общему календарю Office 365.

Строка «Känel» приводит к «Ku00e4nel», когда я анализирую ответ API Graph, используя ArduinoJSON, который не поддерживает ни UTF-8, ни UTF-16, но «u00e4» - это Unicode, так что происходитздесь?

Разработчик сказал мне, что проанализированные строки не затрагиваются, поэтому вывод должен работать, если источник находится в UTF-8, который относительно вывода, по-видимому, нет.

У меня уже естьпопытался установить кодировку в заголовке, но, возможно, я не знаю других доступных опций, которые помогли бы мне избавиться от моей проблемы.

Код:

String response = "";
DynamicJsonBuffer JSONBuffer;

http.begin(graphAPI);
http.addHeader("Authorization", "Bearer " + token);
http.addHeader("Prefer", "outlook.timezone = \"Central Europe Standard Time\"");
http.addHeader("Content-type", "application/json; charset=UTF-8");

int httpResponseCode = http.GET();

if (httpResponseCode = 200) {
    response = http.getString();                       
    JsonObject& parsed = JSONBuffer.parseObject(response);

    if (parsed.success()) {
        for (int i = 0; i < parsed["value"].size(); i++) {
            String startTime = parsed["value"][i]["start"]["dateTime"];
            startTime = startTime.substring(11, 16);
            String endTime = parsed["value"][i]["end"]["dateTime"];
            endTime = endTime.substring(11, 16);
            String subject = parsed["value"][i]["subject"];

            next_y += 35;
            display_u8.setCursor(static_x, next_y);

            display_u8.print(startTime + " - " + endTime + " " + subject);
        }
    } else {
        display_u8.println("Parsing failed");
    }

Пример ответа:

"value": [
{
    "@odata.etag": "W/"Npd9zqlLQE+/S5XEMoC9AAAAIkfORw=="",
    "id": ".............",
    "subject": "von Känel Sacha ",
    "start": {
        "dateTime": "2019-02-11T13:00:00.0000000",
        "timeZone": "Central Europe Standard Time"
    },
    "end": {
        "dateTime": "2019-02-11T14:00:00.0000000",
        "timeZone": "Central Europe Standard Time"
    }
},
{
    "@odata.etag": "W/"Npd9zqlLQE+/S5XEMoC9AAAAIkfOiQ=="",
    "id": ".............",
    "subject": "von Känel Sacha ",
    "start": {
        "dateTime": "2019-02-11T15:00:00.0000000",
         "timeZone": "Central Europe Standard Time"
    },
    "end": {
        "dateTime": "2019-02-11T16:00:00.0000000",
        "timeZone": "Central Europe Standard Time"
    }
}
],
}

Анализируемые строки должны отображаться как "von Känel Sacha", а не как "von Ku00e4nel Sacha".

Редактировать: Я только что обнаружил, что источником проблемы является сам Microsoft Graph API, который кодирует символ "ä" как \ u00e4, но, на мой взгляд, это неправильно, учитывая, что я установилкодировка UTF-8, которая не будет работать с этим представлением Unicode.

1 Ответ

0 голосов
/ 11 февраля 2019

В соответствии со спецификацией JSON экранирование таких символов в UNICODE заключается в достижении полного охвата символов, используемых в ответе, и поэтому источником проблемы является не проблема API-интерфейса Microsoft Microsofts, а сама библиотека JSON Arduino, которая являетсяне может соответствовать спецификациям JSON.

В качестве решения я теперь использовал этот ArduinoJSON форк, который работает без нареканий https://github.com/trilader/ArduinoJson

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...