ヌル文字
ヌル文字(ヌルもじ、英: null character)またはヌル終端文字(ヌルしゅうたんもじ、英: null terminator)は、値0の制御文字である。NULと表記される場合もある[1]。nullの英語での発音はヌルよりナルに近いため、ナル文字と呼ばれることもある[注釈 1]が、ここでは記事名に準じてヌル文字と表記する。
多くの文字集合にはヌル文字の定義がある。ISO/IEC 646(ASCII)、C0制御コード、C1制御コード、ISO/IEC 10646(Unicode)、EBCDICなどの文字集合は全てヌル文字を含んでいる。一方で、JIS X 0208などのように、これを収録しない文字集合もある。ASCII、Unicode、EBCDICなどではヌル文字はコードポイント0に当てられている。多くのプログラミング言語ではヌル文字を使用できる[2]。C言語などでは、ヌル文字のコードは0であると定義されている。
用途
[編集]ヌル文字は元々NOPと似たような意味で利用されていた。プリンターや端末にヌル文字を送っても何も起こらない(スペースとして表示するターミナルもあるがこれは誤り)。テレタイプ端末をコンピュータの出力デバイスとして使う際には、各行の末尾にヌル文字を(場合によっては複数)送信することで、機械的な印字機構が行頭に戻るための時間を稼いでいた[要出典]。
紙テープではヌル文字は穴のない行として表現される(新品の紙テープは全てヌル文字で埋められていると考えてもよい)。この場合、穴のない行に新しく文字をパンチすることで、ヌル文字で埋められている箇所に文字を「挿入」できる。
通例文字列は文字の配列によって実現されるが、ヌル文字は主にC言語とその派生言語の1つであるC++、および各種のデータフォーマットにおいて、文字列の終端を表す文字として重要な役割を担っている[5]。つまり、文字列の最後の文字の次にヌル文字を置くことで番兵の役割を持たせている。このような形式の文字列は一般的にヌル終端文字列(null-terminated string)と呼ばれ、さらに1バイト単位でエンコーディングされている場合はヌル終端バイト文字列(null-terminated byte string)と呼ばれる[6]。GNU版のfindやxargsでは、複数のファイル名をヌル文字で区切ることで、ホワイトスペースが含まれるファイル名を正しく扱えるようにするオプションがある[7][8]。
このような特殊性もあってヌル文字を含むデータを正しくハンドリングできない処理系もあり、たとえばCascading Style Sheets 2.1においては、(エスケープによって生成したものを含めて)スタイルシートにヌル文字が含まれる場合の動作は未定義としている[9]。一般的なテキストファイル(プレーンテキスト)形式では、ヌル文字が含まれることはない。
Javaや.NETに代表される、モダンなプログラミング言語およびプログラミング環境では、文字配列によるバッファのほかに文字列の長さ情報を併せ持つカプセル化されたデータ構造によって文字列を表現し、ヌル文字は終端の役割を持たない。この方式では、文字列の途中にヌル文字を含むことも可能である。
表記方法
[編集]ソースコードの文字列リテラル中では、ヌル文字は\0
のようなエスケープシーケンスの形で表記されることが多い[10]。
多くの言語(この記法を導入したC言語を含む)では、これはヌル文字専用のエスケープシーケンスではないため注意が必要である。これは8進数で文字を表現しているだけであるため、\0
の後に0
から7
の数字を続けて書くと、8進数2桁の数で表される文字として解釈されてしまう[注釈 2]。
\0
以外の表記方法として\000
や\x00
を使うプログラミング言語もある。Unicodeにおいては\u0000
または\z
がヌル文字を表す表現として用いられる。URL中に(特にユーザー入力由来の)ヌル文字が現れる場合は%00
で置き換えられるが、これは「ヌルバイトインジェクション」と呼ばれる攻撃に対するセキュリティホールになるのを避けるためである[11]。
キャレット記法ではヌル文字は^@
で表わされる。US配列キーボードには、Ctrlを押したまま@を入力するとヌル文字を入力できるものがある(US配列の場合@を入力するには⇧ Shiftを押しながら2やPを押下する)。ヌル文字をCtrl2やCtrlspaceで入力できる場合もある[要出典]。
文書中では、ヌル文字を1em幅の"NUL"と書かれたシンボルで表現することがある(組文字)。Unicodeにはこれに対応するグリフとして"symbol for null"(U+2400, ␀)があるが、あくまで"NUL"を表現するためだけのもので、これと実際のヌル文字(U+0000)は別物であるため注意が必要である。
符号位置
[編集]記号 | Unicode | JIS X 0213 | 文字参照 | 名称 |
---|---|---|---|---|
� | U+0000 |
|
� � |
ヌル文字 |
␀ | U+2400 |
|
␀ ␀ |
symbol for null |
関連項目
[編集]脚注
[編集]注釈
[編集]- ^ JIS X 3010:2003『プログラム言語C』およびJIS X 3014:2003『プログラム言語C++』を参照。
- ^ YAMLではこの場合もヌル文字として扱われる。
出典
[編集]- ^ “ASCII format for Network Interchange”. 2013年8月3日閲覧。 “NUL (Null): The all-zeros character which may serve to accomplish time fill and media fill.”
- ^ "A byte with all bits set to 0, called the null character, shall exist in the basic execution character set; it is used to terminate a character string literal." — ANSI/ISO 9899:1990 (the ANSI C standard), section 5.2.1
- ^ 空文字(ヌル文字 / NUL)とは - IT用語辞典 e-Words
- ^ null characterの意味・使い方|英辞郎 on the WEB
- ^ "A string is a contiguous sequence of characters terminated by and including the first null character" — ANSI/ISO 9899:1990 (the ANSI C standard), section 7.1.1
- ^ “Working Draft, Standard for Programming Language C++ (ISO/IEC 14882 standard working draft: N3337) - §17.5.2.1.4.1 Byte strings” (PDF). ISO/IEC. p. 406 (2012年1月16日). 2024年12月20日閲覧。 “A null-terminated byte string, or ntbs, is a character sequence whose highest-addressed element with defined content has the value zero (the terminating null character); no other element in the sequence has the value zero.”
- ^ MAN page of FIND 2014年8月17日(2014年8月22日閲覧)。
- ^ Man page of FIND
- ^ 4.1.3 Characters and case - Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification W3C、2011年6月7日(2013年9月29日閲覧)。
- ^ Kernighan and Ritchie, C, p. 38
- ^ Null Byte Injection WASC Threat Classificationのヌルバイトインジェクションの説明
外部リンク
[編集]- Null Byte Injection WASC Threat Classificationのヌルバイトインジェクションの説明
- Poison Null Byte Introduction ヌルバイトインジェクションの概説