使用できるUnicodeセンチネル値


14

私はファイル形式を設計しており、それを正しく行いたいと思っています。バイナリ形式であるため、ファイルの最初のバイト(またはバイト)が有効なテキスト文字を形成しないようにする必要があります(PNGファイルヘッダー1のように)。これにより、形式を認識しないツールでも、最初の数バイトを調べることでテキストファイルではないことがわかります。

上記のコードポイント0x7Fはすべて無効なUS-ASCIIなので、簡単です。しかし、Unicodeの場合はまったく別の話です。別に有効なUnicode文字からある民間利用の文字noncharacters歩哨は私がに見られるような、Unicodeのプライベート用途のキャラクター、Noncharacters&センチネルよくある質問

無効なUS-ASCII、UTF-8、UTF-16LE、UTF-16BEになるファイルの先頭で使用できるバイトのセンチネルシーケンスは何でしょうか。

  • 明らかに、最初のバイトは0x80有効なUS-ASCII(制御)文字になるため、以下の値を持つ0x00ことはできません。したがって、使用することはできません。
  • また、私用文字は有効なUnicode文字であるため、これらのコードポイントも使用できません。
  • それはリトルエンディアンとビッグエンディアンの両方のUTF-16で動作しなければならないので、非文字などは、0xFFFEその逆としてもできません0xFEFF有効なUnicode文字です。
  • 上記の質問には、任意の使用していないことを示唆しているnoncharacters何かのようなので、まだ、有効なUnicodeシーケンスにつながることなどを0xFFFF行う画像のもあります。

私が使用するために残されている将来の保証のセンチネル値は何でしょうか?


1)PNG形式には、最初のバイトとして非ASCII 0x89値があり、その後に文字列が続きますPNG。PNGの最初の数バイトを読んだツールは、それが解釈できないのでそれがバイナリファイルであると決定するかもしれません0x89。一方、GIFファイルは、有効で読み取り可能なASCII文字列で始まり、GIFその後にさらに3つの有効なASCII文字が続きます。GIFの場合、ツールは読み取り可能なテキストファイルであると判断する場合があります。これは間違っており、非テクスチャバイトシーケンスでファイルを開始するというアイデアは、Andy McFaddenによるDesigning File Formatsから生まれました。


3
Since it is a binary format, the first bytes of the file should not form valid textual characters-このアプリケーションがファイルタイプを識別する方法を示すマジックファイル(多くのUNIXシステムでは/ usr / share / magic、または/ etc / magic)を確認する必要があります。PNGファイルは\x89PNG\x0d\0a\x1a\x0a、「PNG」に注意してください。これは生の文字列です。シーケンス\x89などは、印刷できないバイトです。

@MichaelTはい、PNGはバイナリ形式であるため、最初のバイトは有効なテキスト文字を形成しません。それが私が意味したことです。私はあなたの要点を見失いましたか?
ダニエルAA Pelsmaeker

7
それは一例でした。.gifはで始まりGIF8ます。SGI moviファイルはで始まりますMOVI。1つのスタイルのzipアーカイブファイルはZZ、より一般的なpkzip形式で始まりPKます。最初のバイトが無効なテキスト文字であるという制約は、野生で見つかったものと一致しないようです。これがなぜ必要なのか興味があります。

3
他のプログラムが不明なファイルを見つけたときの動作を本当に気にしますか?私にとって、署名シーケンス(PNGファイルなど)はセンチネルシーケンスよりもはるかに便利です。コンテンツが単純なストリームプロトコルを介して送信されると、受信者は次のバイトの処理方法をすぐに決定できます。Omani-sentinelシーケンスは、誰もが独自のフォーマットを識別するために使用を開始すると、シーケンスのほとんどとなりません。
コーディズム

2
@Virtlink、私はあなたがあなたのファイル形式で使用するバイトを特に気にしません。しかし、あなたはアスキー文字を使用するのが「間違っている」と主張しました...しかし、私はここでその主張をサポートするものを見ていません、そしてそれが本当に重要ではないことを示す経験的な経験がたくさんあります(すなわち、無数のファイル)何十年も問題なくASCII文字を使用しているフォーマット
GrandmasterB

回答:


16

0xDC 0xDC

  • 明らかに無効なUTF-8およびASCII
  • UTF-16のエンディアンに関係なく、先頭の位置にあるペアになっていない証跡の代理。それよりも無効なUTF-16を取得することはありません。

しかし、完全に妥当なISO-8859-1であり、おそらく8ビットエンコーディングを使用する他の文字セットでは妥当です。
パルジファル

4
+1 OPはISO 8859-1を要求せず、US-ASCIIとUTF- *のみを要求しました。
ロスパターソン

@RossPatterson-本当ですが、それは主にOPが問題を本当に考えていないからだと思います。バックアップする統計情報がなければ、ランダムな「このテキストである」アルゴリズムは、UTF-16よりもISO-8859-1を優先する可能性が高いと確信しています。世界のテキスト。
パルシファル

3
@parsifal任意のバイナリは有効なISO-8859-1であるため、無効なISO-8859-1を作成することは不可能であるという理由だけで考慮する必要はありません。
エサイリヤ

1
@parsifal trueであり、それがあなたが単に使用できる要件であるか0x00、または何であれ、しかしopはそれを望んでいませんでした。
エサイリヤ

5
  • UTF-8では、バイトC0、C1、およびF5-FFは無効です。最初のバイトはASCIIまたはC2〜F4の範囲のバイトである必要があります。他の開始バイトは有効なUTF-8ではありません。

  • UTF-16では、ファイルは通常バイト順マーク(U + FEFF)で始まります。それ以外の場合、アプリケーションはバイト順を推測する必要があります。D800-DBFFの範囲のコードポイントはサロゲートペアの先頭バイトであり、DC00-DFFFはサロゲートペアの末尾バイトです。

したがって、バイトコンボを使用しますF5DC。これらの2つの値は次のとおりです。

  • ASCIIではない
  • 無効なUTF-8
  • サロゲートペアのUTF-16トレーリングバイト(非合法)またはプライベート使用文字であるコードポイントU + F5DC として解釈されますが、BOMがなくてもこれをUTF-16として解釈しようとするアプリケーションによってのみ

あなたはより多くのオプションが必要な場合は、F5DDに至るまでF5DFのすべてのように行う、同じ3つの性質を持っているF6DC- F6DFF7DC- F7DFF8DC- F8DF、から選択する16種類のバイトコンボの合計。


それでは、U + DCDCを使用するというEsailijaの提案0xDCは、有効なUTF-8でしょうか?
ダニエルAA Pelsmaeker

2
@Virtlink 0xDCは、2バイトシーケンスのUTF-8リードバイトです。10xxxxxx有効にするには、継続バイトを続ける必要があります。0xDC有効な継続バイトで0xDC 0xDCはないため、有効なUTF-8ではありません。
エサイリヤ

@Virtlink:いいえ、2番目のバイトは無効であるため、範囲内にある必要があります80- BF
マーティンピーターズ

2

「テキストではない」ことを示すために印刷できない文字を使用しようとしている場合、0x89を超えるのは難しいでしょう。

  • US-ASCIIの範囲外です
  • ISO-8859-1では、印刷不可能な文字です(「正当性を備えた文字タブ」)。同様に、Shift-JISでも同様です。ただし、他の8ビットエンコーディングでは、これを有効な文字として扱う場合があります。
  • UTF-8では、マルチバイトシーケンスの無効な最初のバイトです(トップビットは10です。これは、マルチバイトシーケンスの文字2..Nのために予約されています)

一般に、マジックナンバーを作成する場合、「非テキスト」は重要ではありません。参照を検索する必要がありますが、標準グラフィック形式の1つ(TIFF、私は思う)には、そのマジックナンバーから6種類の有用な情報のようなものがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.