Это старый вопрос с множеством хороших ответов, но нужно добавить одну вещь.
Все ответы очень общие. Я хотел бы добавить примеры использования спецификации, которые на самом деле вызывают реальные проблемы, но многие люди об этом не знают.
сценарии разрыва спецификации
Сценарии оболочки, сценарии Perl, сценарии Python, сценарии Ruby, сценарии Node.js или любой другой исполняемый файл, который должен запускаться интерпретатором - все начинается с строки shebang , которая выглядит как одна из этих :
#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node
Сообщает системе, какой интерпретатор должен быть запущен при вызове такого скрипта. Если сценарий закодирован в UTF-8, может возникнуть соблазн включить вначале спецификацию. Но на самом деле "#!" персонажи не просто персонажи. На самом деле это магическое число , состоящее из двух символов ASCII. Если вы поместите что-то (например, спецификацию) перед этими символами, то файл будет выглядеть так, как будто он имеет другое магическое число, и это может привести к проблемам.
См. Википедию, статья: Шебанг, раздел: Магическое число :
Символы Шебанга представлены теми же двумя байтами в
расширенные кодировки ASCII, включая UTF-8, который обычно используется для
скрипты и другие текстовые файлы в современных Unix-подобных системах. Тем не мение,
Файлы UTF-8 могут начинаться с дополнительной метки порядка байтов (BOM); если
Функция "exec" специально определяет байты 0x23 и 0x21, затем
наличие спецификации (0xEF 0xBB 0xBF) до того, как шебанг предотвратит
интерпретатор сценария от исполнения. Некоторые власти рекомендуют
против использования метки порядка байтов в сценариях POSIX (Unix-like), [14]
по этой причине и для более широкого взаимодействия и философского
проблемы. Кроме того, метка порядка следования байтов не требуется в UTF-8,
поскольку у этой кодировки нет проблем с порядком байтов; это служит только для
идентифицировать кодировку как UTF-8. [выделение добавлено]
Спецификация недопустима в JSON
См. RFC 7159, раздел 8.1 :
Реализации НЕ ДОЛЖНЫ добавлять метку порядка байтов в начало текста JSON.
Спецификация избыточна в JSON
Не только это недопустимо в JSON, но и не нужно для определения кодировки символов, поскольку существуют более надежные способы однозначного определения как кодировки символов, так и порядка байтов, используемого в любой поток JSON (подробности см. в этом ответе ).
спецификация ломает парсеры JSON
Мало того, что недопустимо в JSON и не нужно , на самом деле ломает все программное обеспечение , которое определяет кодировку с использованием метода, представленного в RFC 4627
Определение кодировки и порядкового номера JSON, проверка первых 4 байтов для байта NUL:
00 00 00 xx - UTF-32BE
00 xx 00 xx - UTF-16BE
xx 00 00 00 - UTF-32LE
xx 00 xx 00 - UTF-16LE
xx xx xx xx - UTF-8
Теперь, если файл начинается с спецификации, он будет выглядеть так:
00 00 FE FF - UTF-32BE
FE FF 00 xx - UTF-16BE
FF FE 00 00 - UTF-32LE
FF FE xx 00 - UTF-16LE
EF BB BF xx - UTF-8
Обратите внимание, что:
- UTF-32BE не запускается с тремя NUL, поэтому он не будет распознаваться
- UTF-32LE, за первым байтом не следуют 3 NUL, поэтому он не будет распознан
- UTF-16BE имеет только 1 NUL в первых 4 байтах, поэтому он не будет распознан
- UTF-16LE имеет только 1 NUL в первых 4 байтах, поэтому он не будет распознан
В зависимости от реализации, все они могут быть неправильно интерпретированы как UTF-8, а затем неверно истолкованы или отклонены как недействительные UTF-8, или не распознаны вообще.
Кроме того, если реализация проверяет действительный JSON, как я рекомендую, он отклонит даже ввод, который действительно закодирован как UTF-8, потому что он не начинается с символа ASCII <128, как это должно быть в соответствии с RFC. </p>
Другие форматы данных
Спецификация в JSON не нужна, является незаконной и нарушает работу программного обеспечения, которое работает в соответствии с RFC. Это должен быть нобрейнер, чтобы просто не использовать его тогда, и тем не менее, всегда есть люди, которые настаивают на нарушении JSON, используя спецификации, комментарии, разные правила цитирования или разные типы данных. Конечно, любой может свободно использовать такие вещи, как спецификации или что-то еще, если вам это нужно - просто не называйте это JSON.
Для других форматов данных, кроме JSON, посмотрите, как они на самом деле выглядят. Если единственными кодировками являются UTF- * и первый символ должен быть символом ASCII ниже 128, то у вас уже есть вся информация, необходимая для определения как кодировки, так и порядкового номера ваших данных. Добавление спецификаций даже в качестве дополнительной функции сделает ее более сложной и подверженной ошибкам.
Другое использование спецификации
Что касается использования вне JSON или сценариев, я думаю, что здесь уже есть очень хорошие ответы. Я хотел добавить более подробную информацию, в частности, о сценариях и сериализации, потому что это пример символов спецификации, вызывающих реальные проблемы.