Ich entwerfe ein Dateiformat und möchte es richtig machen. Da es sich um ein Binärformat handelt, sollte das erste Byte (oder die ersten Bytes) der Datei keine gültigen Textzeichen bilden (genau wie im PNG-Dateikopf 1 ). Auf diese Weise können Tools, die das Format nicht erkennen, anhand der ersten Bytes erkennen, dass es sich nicht um eine Textdatei handelt.
Jeder obige Codepunkt 0x7F
ist ungültig (US-ASCII), das ist also einfach. Aber für Unicode ist das eine ganz andere Geschichte. Neben gültigen Unicode - Zeichen gibt es Privatnutzungs Zeichen , noncharacters und Sentinels , wie ich in den gefundenen Unicode Privat-Use Charaktere, Noncharacters & Sentinels FAQ .
Was wäre eine Sentinel-Folge von Bytes, die ich am Anfang der Datei verwenden könnte und die zu ungültigem US-ASCII, UTF-8, UTF-16LE und UTF-16BE führen würde?
- Offensichtlich kann das erste Byte keinen niedrigeren Wert haben
0x80
, da dies ein gültiges US-ASCII-Zeichen (Steuerzeichen) wäre und daher0x00
nicht verwendet werden kann. - Da Zeichen für den privaten Gebrauch gültige Unicode-Zeichen sind, kann ich diese Codepunkte auch nicht verwenden.
- Da es sowohl mit Little- Endian- als
0xFFFE
auch mit Big-Endian-UTF-16 funktionieren muss , ist ein Nicht-Zeichen, wie es auch nicht möglich ist, da sein Gegenteil0xFEFF
ein gültiges Unicode-Zeichen ist. - In den oben genannten häufig gestellten Fragen wird empfohlen , keine der Sonderzeichen zu verwenden, da dies immer noch zu einer gültigen Unicode-Sequenz führen würde
0xFFFF
.
Welche zukunftssicheren Sentinel-Werte stehen mir noch zur Verfügung?
1 ) Das PNG-Format hat als erstes Byte den Nicht-ASCII- 0x89
Wert, gefolgt von der Zeichenfolge PNG
. Ein Tool, das die ersten paar Bytes eines PNG liest, stellt möglicherweise fest, dass es sich um eine Binärdatei handelt, da es diese nicht interpretieren kann 0x89
. Eine GIF-Datei beginnt dagegen direkt mit der gültigen und lesbaren ASCII-Zeichenfolge, GIF
gefolgt von drei weiteren gültigen ASCII-Zeichen. Für GIF kann ein Tool bestimmen, dass es sich um eine lesbare Textdatei handelt. Dies ist falsch und die Idee, die Datei mit einer nicht-texturalen Byte-Sequenz zu starten, stammt aus Designing File Formats von Andy McFadden.
GIF8
. Eine SGI-Movi-Datei beginnt mit MOVI
. Eine Art von Zip-Archivdateien beginnt mit ZZ
, das populärere pkzip-Format beginnt mit PK
. Die Einschränkung, dass das erste Byte ein ungültiges Textzeichen ist, scheint nicht mit dem übereinzustimmen, was in freier Wildbahn gefunden wird. Ich bin gespannt, warum dies eine Voraussetzung ist.
Since it is a binary format, the first bytes of the file should not form valid textual characters
- Sie sollten sich die Magic-Datei ansehen (/ usr / share / magic oder / etc / magic auf vielen Unix-Systemen), die zeigt, wie diese Anwendung Dateitypen identifiziert. Eine PNG-Datei beginnt mit\x89PNG\x0d\0a\x1a\x0a
- beachten Sie, dass "PNG" eine rohe Zeichenfolge ist. Die Sequenzen\x89
und dergleichen sind nicht druckbare Bytes.