ヌル文字(ヌルターミネータとも呼ばれる)は、値がゼロの制御文字である。 [1] [2] [3] [4] これは、 BaudotコードやITA2コード、ISO/IEC 646(またはASCII)、C0 制御コード、Universal Coded Character Set(またはUnicode)、EBCDICで定義された文字セットを含む多くの文字セットに存在している。ほとんどすべての主流のプログラミング言語で使用できる。[5]これはNUL(またはNULLだが、一部の文脈ではこの用語はヌルポインターを指すために使用される)と略されることが多い。8 ビットコードでは、ヌルバイトと呼ばれる。
この文字の本来の意味はNOPに似ており、プリンタや端末に送信されても効果はありません (ただし、一部の端末では誤ってスペースとして表示されます)。電気機械式テレプリンタがコンピュータの出力デバイスとして使用されていたとき、次の行の最初の印刷位置に戻るための時間を与えるため、印刷された各行の末尾に 1 つ以上のヌル文字が送信されました。[要出典]パンチテープでは、文字は穴がまったくない状態で表現されるため、新しいパンチされていないテープは最初はヌル文字で埋められ、多くの場合、ヌル文字の上に新しい文字をテープにパンチすることで、ヌル文字の予約スペースにテキストを挿入できました。
今日では、この文字はプログラミング言語Cとその派生言語、および多くのデータ形式でより大きな意味を持ち、文字列の終了を示す予約文字として機能し、[6]しばしばヌル終端文字列と呼ばれます。[7]これにより、1バイトのオーバーヘッドのみで文字列を任意の長さにすることができます。カウントを格納する代わりに、文字列の長さの制限が255であるか、1バイトを超えるオーバーヘッドが必要になります(ヌル終端文字列の記事で説明されている他の利点/欠点があります)。
表現
ソースコードでは、ヌル文字は文字列リテラル内のエスケープシーケンス ( など) または文字定数 ( ) として表現されることが多いです。後者は、代わりに単に(引用符もスラッシュもなしで)と記述されることもあります。 [8]多くの言語 (この表記法を導入したC など) では、これは独立したエスケープシーケンスではなく、単一の8 進数字 0 を含む 8 進エスケープシーケンスです。したがって、の後に までの数字を続けることはできません。そうでない場合は、より長い 8 進エスケープシーケンスの開始として解釈されます。[9]さまざまな言語で使用されているその他のエスケープシーケンスには、、 、、または があります。パーセントコードを使用すると、URLにヌル文字を配置できます。
\0"abc\0def"'\0'0\007\000\x00\z\u0000 %00
ヌル文字を表現できるからといって、結果の文字列が正しく解釈されるとは限りません。多くのプログラムはヌルを文字列の終わりとみなすからです。そのため、ヌル文字を入力できると(チェックされていないユーザー入力の場合)、ヌルバイトインジェクションと呼ばれる脆弱性が生じ、セキュリティ上の脆弱性につながる可能性があります。[10]
キャレット表記では、ヌル文字は です。キーボードによっては、 を押したまま キーを押す^@ことでヌル文字を入力できます(米国のレイアウトでは、@ 記号を入力する必要がないため、+だけで機能することがよくあります)。
Ctrl@Ctrl2⇧ Shift
null の16 進表記は です00。Base64文字列をデコードすると、AA== null 文字も生成されます。
ドキュメントでは、ヌル文字は、文字「NUL」を含む 1em 幅の記号として表されることがあります。 Unicode には、これを表す文字があります: U+2400 ␀ SYMBOL FOR NULL。
エンコーディング
すべての最新の文字セットでは、ヌル文字のコード ポイント値は 0 です。ほとんどのエンコードでは、これは 0 値を持つ単一のコード ユニットに変換されます。たとえば、UTF-8では1 つの 0 バイトです。ただし、Modified UTF-8では、ヌル文字は0xC0,0x80 の2 バイトとしてエンコードされます。これにより、現在はどの文字にも使用されていない 0 値を持つバイトを文字列の終端文字として使用できるようになります。
参考文献
- ^ ネットワーク交換用の ASCII 形式。IETF。sec . 5.2。doi : 10.17487/RFC0020。RFC 20。NUL ( Null): 時間充填およびメディア充填を実行するために使用される、
すべてゼロの文字。
- ^ 「ISO 646 の制御文字セット」(PDF)。事務局 ISO/TC 97/SC 2。1975 年 12 月 1 日。p. 4.4。2014 年 5 月 12 日のオリジナル(PDF)からアーカイブ。
位置: 0/0、名前: Null、略語: Nul
- ^ 「Unicode 文字 'NULL' (U+0000)」。2018 年 10 月 20 日閲覧。
- ^ 「C0 コントロールと基本ラテン文字」(PDF)。Unicode コンソーシアム。2018 年。2018 年 10 月 20 日閲覧。
- ^ 「すべてのビットが 0 に設定されたバイトはヌル文字と呼ばれ、基本実行文字セットに存在する必要があります。これは文字列リテラルを終了するために使用されます。」— ANSI/ISO 9899:1990 (ANSI C 標準)、セクション 5.2.1
- ^ 「文字列とは、最初のヌル文字で終了し、ヌル文字を含む連続した文字のシーケンスです」— ANSI/ISO 9899:1990 (ANSI C 標準)、セクション 7.1.1
- ^ ワーキングドラフト、プログラミング言語 C++ の標準(PDF) (ISO 14882 標準ワーキングドラフト)、ISO / IEC、2011 年 2 月 28 日、p. 427、N3242=11-0012 、 2013 年2 月 27 日取得、
ヌル
終端バイト文字列(NTBS) は、定義された内容を持つ最上位アドレスの要素の値が 0 (
終端のヌル文字
)である文字シーケンスです
。シーケンス内の他の要素の値は 0 ではありません。
- ^ Kernighan and Ritchie, C、p. 38:「文字定数 '\0' は、値が 0 の文字、つまりヌル文字を表します。式の文字の性質を強調するために、0 の代わりに '\0' が記述されることがよくありますが、数値は 0 です。」}}
- ^ YAMLでは、この組み合わせは別のエスケープ シーケンスになります。
- ^ Null バイト インジェクション WASC 脅威分類 Null バイト攻撃セクション。
