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.
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.GIF8
. Eine SGI-Movi-Datei beginnt mitMOVI
. Eine Art von Zip-Archivdateien beginnt mitZZ
, das populärere pkzip-Format beginnt mitPK
. 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.Antworten:
0xDC 0xDC
quelle
0x00
oder was auch immer, aber op wollte das nicht.In UTF-8 sind die Bytes C0, C1 und F5 - FF unzulässig. Das erste Byte muss entweder ASCII oder ein Byte im Bereich C2-F4 sein, jedes andere Startbyte ist ungültig UTF-8.
In UTF-16 beginnt die Datei normalerweise mit dem Byte Order Mark (U + FEFF), ansonsten müssen die Anwendungen die Byte-Reihenfolge erraten. Codepunkte im Bereich D800-DBFF sind führende Bytes für ein Ersatzpaar, und DC00-DFFF sind die nachfolgenden Bytes für ein Ersatzpaar.
Daher würde ich die Byte-Kombination verwenden
F5DC
. Diese beiden Werte sind:Wenn Sie mehr Optionen benötigen, haben
F5DD
bisF5DF
alle dieselben 3 Eigenschaften wieF6DC
-F6DF
,F7DC
-F7DF
undF8DC
-F8DF
, sodass Sie aus insgesamt 16 verschiedenen Bytekombinationen auswählen können.quelle
0xDC
wäre UTF-8 gültig?0xDC
ist ein UTF-8-Lead-Byte für eine 2-Byte-Sequenz. Es muss ein10xxxxxx
Fortsetzungsbyte folgen , damit es gültig ist.0xDC
ist kein gültiges Fortsetzungsbyte, daher0xDC 0xDC
ist UTF-8 nicht gültig.80
- liegenBF
.Wenn Sie versuchen, ein nicht druckbares Zeichen zu verwenden, um "kein Text" anzugeben, ist es schwierig, 0x89 zu schlagen:
Wenn Sie magische Zahlen bilden, ist "Nicht-Text" im Allgemeinen ein untergeordneter Punkt. Ich muss die Referenz nachschlagen, aber eines der Standard-Grafikformate (TIFF, glaube ich) enthält ungefähr sechs verschiedene nützliche Informationen aus seiner magischen Zahl.
quelle