Я розробляю формат файлу і хочу зробити це правильно. Оскільки це двійковий формат, найперший байт (або байти) файлу не повинен утворювати дійсних текстових символів (як у заголовку 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тощо можуть бути недрукованими байтами.