Копание в реализации Python JSON-декодера Я заметил, что если строка передается в json.loads
и начинается с \ufeff
, то есть UTF-16 BOM , это поднимает JSONDecodeError
:
if isinstance(s, str):
if s.startswith('\ufeff'):
raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)", s, 0)
( GitHub )
RFC3629 (UTF-8) устанавливает два случая, когда спецификация UTF-16 должна быть запрещена, но ни один из них, похоже, не применим к JSON:
o Протокол ДОЛЖЕН запрещать использование U + FEFF в качестве подписи для тех,
элементы текстового протокола, которые протокол обязывает быть всегда
UTF-8, функция подписи совершенно бесполезна в тех
случаи.
o Протокол ДОЛЖЕН также запрещать использование U + FEFF в качестве подписи для
те текстовые элементы протокола, для которых протокол обеспечивает
механизмы идентификации кодировки символов, когда это ожидается
что реализации протокола будут в состоянии
всегда используйте механизмы правильно. Это будет тот случай, когда
элементы протокола находятся под строгим контролем
реализация от времени их создания до времени
их (правильно маркированная) передача.
RFC7159 (JSON) говорит, что:
Текст JSON ДОЛЖЕН быть закодирован в UTF-8, UTF-16 или UTF-32.
кодировка по умолчанию - UTF-8, и тексты JSON, которые кодируются в UTF-8.
совместимы в том смысле, что они будут успешно прочитаны
по максимальному количеству внедрений; Здесь очень много
реализации, которые не могут успешно читать тексты в других
кодировки (такие как UTF-16 и UTF-32).
Так что мне кажется, что UTF-16 должен быть разрешен. Так почему же тогда Python поднимает здесь? Я явно что-то упускаю.