16進数でのスペース(20)とタブ(09)

スペース(0x20)とタブ(0x09)文字のhex値を学びます。hex分析でコード、設定ファイル、データ解析のホワイトスペース問題をデバッグします。

Common Values

Hex

20 09

ASCII

SP, HT (whitespace)

詳細な説明

最も一般的な2つのホワイトスペース文字 — スペースと水平タブ — のhex値はそれぞれ2009です。ほとんどのテキストエディタでは不可視ですが、hexエディタではこれらの文字は明確に区別されるため、ソースコード、設定ファイル、データ形式のホワイトスペース問題をデバッグする決定的な方法となります。

スペース — hex 20(10進数32):

スペース文字(ASCII 32、hex 20)は最初の印字可能なASCII文字であり、標準的な単語セパレータです。hexダンプでは、hexカラムに20として、ASCIIカラムには実際のスペースとして表示されます。一部のhexエディタはスペースを可視化するために中点(·)として表示します。

タブ — hex 09(10進数9):

水平タブ文字(ASCII 9、hex 09)は、カーソルを次のタブストップに進める制御文字です。hexダンプでは、hexカラムに09として表示され、ASCIIカラムには通常..または何も表示されません(ASCII 32未満の非印字文字のため)。

hexでのタブ対スペース論争:

永遠の「タブ対スペース」問題が実際のバグを引き起こした場合、hexエディタは反論の余地のない証拠を提供します。スペースによるインデントは繰り返される20バイトとして表示されます:

20 20 20 20 69 66 20 28    "    if ("

タブによるインデントは09バイトとして表示されます:

09 69 66 20 28              ".if ("

混合インデント(最悪のシナリオ)は、同じファイル内、時には隣接する行で両方のパターンを示します。

一般的なホワイトスペースデバッグシナリオ:

  1. YAMLインデントエラー — YAMLはタブではなくスペースが必要。YAMLファイルの解析が失敗した場合、hexでインデント内の09バイトを確認
  2. Makefileターゲットレシピ — Makeはレシピコマンドの前にスペース(20)ではなくタブ(09)が必要。スペースインデントされたMakefile行は"missing separator"エラーを生成
  3. 末尾のホワイトスペース — 一部のリンターやGitフックは末尾のホワイトスペースをフラグ。hexで0A(LF)または0D 0A(CRLF)の直前の2009バイトを探す
  4. ノーブレークスペース — ノーブレークスペース(UTF-8でC2 A0、Unicode U+00A0)がコードに紛れ込むことがあり、通常のスペースと同じに見えるがパーサーの障害を引き起こす

その他のホワイトスペース文字:

スペースとタブ以外にも、いくつかのホワイトスペース文字が存在します: 垂直タブ(0B)、フォームフィード(0C)、キャリッジリターン(0D)、および各種Unicodeホワイトスペース文字。UTF-8では、emスペース(U+2003)はE2 80 83、シンスペース(U+2009)はE2 80 89、ゼロ幅スペース(U+200B)はE2 80 8Bです。これらの特殊なスペースは、Webページやワードプロセッサからテキストを貼り付けた際に不思議なバグを引き起こすことがあります。

ユースケース

hexレベルのホワイトスペース分析は、Makefileのタブ要件のデバッグ、YAMLインデント障害、不可視のノーブレークスペースバグ、リンターがフラグする末尾ホワイトスペース問題に最適な方法です。

試してみる — Hex Editor

フルツールを開く