Как `JSONDecoder` знает, какую кодировку использовать? - PullRequest
0 голосов
/ 01 марта 2019

Прочитав Джоэл о кодировании , как хороший мальчик, я обнаружил, что озадачен работой JSONDecoder Фонда, и ни один из методов init или decode не принимает значение кодировки.Просматривая документы, я вижу переменную экземпляра dataDecodingStrategy , которая, возможно, именно здесь происходит волшебство угадывания кодирования ...?

Я что-то здесь упустил?Разве JSONDecoder не нужно знать кодировку данных, которые он получает?Я понимаю, что стандарт JSON требует, чтобы эти данные были в кодировке UTF-8, но может ли JSONDecoder сделать такое предположение?Я в замешательстве.

1 Ответ

0 голосов
/ 01 марта 2019

RFC 8259 (с 2017 года) требует, чтобы

Текст JSON, передаваемый между системами, которые не являются частью замкнутой экосистемы, ДОЛЖЕН быть закодирован с использованием UTF-8.

В старых RFC 7159 (с 2013 г.) и RFC 7158 (с 2013 г.) указано, что

текст JSON ДОЛЖЕН быть закодированв UTF-8, UTF-16 или UTF-32.Кодировка по умолчанию - UTF-8, а тексты JSON, которые кодируются в UTF-8, являются совместимыми в том смысле, что они будут успешно прочитаны максимальным числом реализаций;Есть много реализаций, которые не могут успешно читать тексты в других кодировках (таких как UTF-16 и UTF-32).

И RFC 4627 (с 2006 года, самая старая из тех, чтоЯ мог бы найти):

Текст JSON ДОЛЖЕН быть закодирован в Unicode.Кодировка по умолчанию - UTF-8.

Поскольку первые два символа текста JSON всегда будут символами ASCII, можно определить, является ли поток октетов UTF-8, UTF-16 (BE или LE) или UTF-32 (BE или LE), взглянув на шаблон нулей в первых четырех октетах.

JSONDecoder (который использует JSONSerialization под капотом) способен декодироватьUTF-8, UTF-16 и UTF-32, как с прямым порядком байтов, так и с прямым порядком байтов.Пример:

let data = "[1, 2, 3]".data(using: .utf16LittleEndian)!
print(data as NSData) // <5b003100 2c002000 32002c00 20003300 5d00>

let a = try! JSONDecoder().decode([Int].self, from: data)
print(a) // [1, 2, 3]

Поскольку допустимый текст JSON должен начинаться с "[" или "{", кодировка может быть однозначно определена из первых байтов данных.

Я сделалне найти это документированное , хотя, и, вероятно, не следует полагаться на это.Будущая реализация JSONDecoder может поддерживать только новый стандарт и потребовать UTF-8.

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