Я разрабатываю формат файла и хочу сделать все правильно. Поскольку это двоичный формат, самый первый байт (или байты) файла не должен образовывать допустимые текстовые символы (как в заголовке файла PNG 1 ). Это позволяет инструментам, которые не распознают формат, по-прежнему видеть, что это не текстовый файл, просматривая первые несколько байтов.
Любой код, указанный выше, 0x7Fявляется недействительным US-ASCII, так что это легко. Но для Unicode это совсем другая история. Помимо допустимых символов Юникода, есть частные символы , нехарактеры и стражи , как я нашел в FAQ по частным персонажам , нехарактерам и часовым .
Какой будет последовательность байтов, которую я могу использовать в начале файла, что приведет к неправильным US-ASCII, UTF-8, UTF-16LE и UTF-16BE?
- Очевидно, что первый байт не может иметь значения ниже,
0x80поскольку это будет действительный символ US-ASCII (управляющий), поэтому0x00его нельзя использовать. - Кроме того, поскольку символы частного использования являются допустимыми символами Unicode, я не могу использовать эти кодовые точки.
- Так как он должен работать как с UTF-16 с прямым порядком байтов, так и с прямым порядком байтов, такой символ , который не является символом ,
0xFFFEтакже невозможен, так как его обратный0xFEFFсимвол является допустимым символом Unicode. - Вышеупомянутые часто задаваемые вопросы предлагают не использовать какой-либо из нехарактерных символов, так как это все равно приведет к правильной последовательности Юникода, поэтому что-то вроде этого
0xFFFFтакже не видно .
Каковы будут сохраняемые для будущего значения дозорных, которые я оставлю для использования?
1 ) Формат PNG имеет в качестве самого первого байта значение не ASCII 0x89, за которым следует строка PNG. Инструмент, который считывает первые несколько байтов PNG, может определить, что это двоичный файл, так как он не может интерпретировать 0x89. Файл GIF, с другой стороны, начинается непосредственно с допустимой и читаемой строки ASCII, GIFза которой следуют еще три действительных символа ASCII. Для GIF инструмент может определить, что это читаемый текстовый файл. Это неверно, и идея начать файл с нетекстурной байтовой последовательности пришла от Энди Макфаддена « Разработка форматов файлов ».
GIF8. Файл SGI MOVI начинается с MOVI. Один стиль файла архива zip начинается с ZZболее популярного формата pkzip PK. Ограничение на то, что первый байт будет недопустимым текстовым символом, похоже, не соответствует тому, что найдено в wild. Мне любопытно, почему это требование.
Since it is a binary format, the first bytes of the file should not form valid textual characters- Вы должны посмотреть на волшебный файл (/ usr / share / magic или / etc / magic на многих системах Unix), который показывает, как это приложение идентифицирует типы файлов. Файл PNG начинается с\x89PNG\x0d\0a\x1a\x0a- обратите внимание на «PNG», это необработанная строка. Последовательности\x89и т.п. являются непечатными байтами.