Я розробляю формат файлу і хочу зробити це правильно. Оскільки це двійковий формат, найперший байт (або байти) файлу не повинен утворювати дійсних текстових символів (як у заголовку 1 файлу PNG ). Це дозволяє інструментам, які не розпізнають формат, все одно бачити, що це не текстовий файл, переглядаючи перші кілька байтів.
Будь-яка кодова точка вище 0x7F
недійсна US-ASCII, тому це просто. Але для Unicode - це зовсім інша історія. Окрім дійсних символів Unicode, існують символи приватного користування , нехарактерні та дозорні , як я виявив у персональних запитаннях щодо Unicode з приватним користуванням, нехарактерними запитаннями та надісланими .
Що таке дозорна послідовність байтів, яку я можу використовувати на початку файлу, що призведе до недійсних US-ASCII, UTF-8, UTF-16LE та UTF-16BE?
- Очевидно, перший байт не може мати значення нижче,
0x80
оскільки це було б дійсним символом US-ASCII (управління), тому0x00
його не можна використовувати. - Крім того, оскільки символи приватного використання є дійсними символами Unicode, я також не можу використовувати ці точки коду.
- Оскільки він повинен працювати як з мало-ендіанським, так і з великим-ендіанським UTF-16, такий нехарактерний характер , як
0xFFFE
він, також неможливий, оскільки його зворотний зв'язок0xFEFF
є дійсним символом Unicode. - Вищезгаданий вище FAQ пропонує не використовувати жодне нехарактерне значення, оскільки це все одно призведе до дійсної послідовності Unicode, тому щось подібне
0xFFFF
також не відображається.
Якими будуть довірені дозорні значення, які мені залишаються використовувати?
1 ) Формат PNG має як перший байт значення, яке не є ASCII 0x89
, а потім рядок PNG
. Інструмент, який читає перші кілька байт PNG, може визначити, що це двійковий файл, оскільки він не може інтерпретувати 0x89
. Файл GIF, з іншого боку, починається безпосередньо з дійсної та читабельної рядка ASCII, GIF
а потім ще трьох дійсних символів ASCII. Для GIF інструмент може визначити, що це текстовий файл, що читається. Це неправильно, і ідея запускати файл із нетекстурною послідовністю байтів виникла з проектування файлових форматів Енді Макфаддена.
GIF8
. Файл SGI Movi починається з MOVI
. Починається один стиль файлу zip-архіву, починається з ZZ
більш популярного формату pkzip PK
. Обмеження, що перший байт є невірним символом тексту, схоже, не відповідає тому, що знаходиться в дикій природі. Мені цікаво, чому це вимога.
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
тощо можуть бути недрукованими байтами.