デリミタ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
CSV形式のテキストファイルからのフラグメントの文体描写。カンマ(赤で表示)は、フィールドの区切り文字として使用されます。

区切り文字は、プレーンテキスト数式、またはその他のデータストリーム内の個別の独立した領域間の境界を指定するための1つ以上の文字のシーケンスです[1] [2]区切り文字の例はコンマ文字です。これは、コンマで区切られたのシーケンスでフィールド区切り文字として機能します区切り文字のもう1つの例は、モールス信号の送信で文字と単語を区切るために使用される時間ギャップです

数学は、区切り文字は操作の範囲を指定するためによく使用され、分離された記号として両方とも発生する可能性があります(たとえば")および反対に見える記号のペアとして(たとえば、かっこ)。

区切り文字は、データストリームの境界を指定するさまざまな手段の1つを表します。たとえば、宣言表記は、データストリームの開始時に長さフィールドを使用して、データストリームに含まれる文字数を指定する代替方法です。[3]

概要

区切り文字は、フィールドとレコードの区切り文字、またはブラケットの区切り文字として特徴付けることができます。

フィールドとレコードの区切り文字

フィールド区切り文字はデータフィールドを区切ります。レコード区切り文字は、フィールドのグループを区切ります。[4]

たとえば、CSVファイル形式では、フィールド間の区切り文字としてコンマを使用し、レコード間の区切り文字として行末インジケーターを使用します。

fname、lname、age、salary
ナンシー、ダヴォリオ、33、$ 30000
erin、borakova、28、$ 25250
トニー、ラファエル、35、28700ドル

これは、CSVファイル形式を使用し た単純なフラットファイルデータベース テーブルを指定します。

ブラケット区切り文字

ブラケット区切り文字は、ブロック区切り文字、領域区切り文字、またはバランス区切り文字とも呼ばれ、テキストの領域の開始と終了の両方をマークします。[5] [6]

角かっこ区切り文字の一般的な例は次のとおりです。[7]

区切り文字 説明
( ) 括弧Lispプログラミング言語の構文は、主に括弧を使用することで認識できるものとして引用されています[8]
{ } 中かっこ(中かっこととも呼ばれます[9]
[ ] ブラケット(一般的に下付き文字を示すために使用されます)
< > 角かっこ[10]
" " 通常、文字列リテラルを表すために使用されます[11]
' ' 通常、文字リテラルを表すために使用されます[11]
<? ?> XML処理命令を示すために使用されます。[12]
/* */ 一部のプログラミング言語でコメントを示すために使用されます。[13]
<% %> 一部のWebテンプレートで、言語の境界を指定するために使用されます。これらはテンプレート区切り文字とも呼ばれます。[14]

規約

歴史的に、コンピューティングプラットフォームは、慣例により特定の区切り文字を使用してきました。[15] [16]次の表は、比較のためのいくつかの例を示しています。

プログラミング言語 ( 「プログラミング言語比較(構文)」も参照)。

文字列リテラル ステートメントの終わり
パスカル 一重引用 セミコロン
Python ダブルクォート、シングルクォート 行末(EOL)

フィールドとレコードの区切り文字( 「 ASCII」、「制御文字」も参照)。

フィールドの終わり レコードの終わり ファイルの終わり
macOSAmigaOSを含むUnixライクなシステム タブ LF 無し
WindowsMS-DOSOS / 2CP / M タブ CRLF なし(CP / Mを除く)、Control-Z [17]
クラシックMacOSApple DOSProDOSGS / OS タブ CR 無し
ASCII /ユニコード ユニットセパレーター
位置31(U + 001F)
RECORD SEPARATOR
ポジション30(U + 001E)
ファイル区切り文字
位置28(U + 001C)

区切り文字の衝突

区切り文字の衝突は、作成者またはプログラマーが、実際には区切り文字を別々の領域間の境界として解釈することを意図せずに、テキストに区切り文字を導入した場合に発生する問題です。[4] [18]たとえば、XMLの場合、これは、作成者が山かっこ文字 を指定しようとするたびに発生する可能性があります。

ほとんどのファイルタイプには、フィールド区切り文字とレコード区切り文字の両方があり、どちらも衝突の影響を受けます。たとえば、カンマ区切り値ファイルの場合、作成者がフィールド値の一部としてカンマを含めようとすると、フィールドの衝突が発生する可能性があり(たとえば、salary = "$ 30,000")、フィールドがフィールドの区切り文字の衝突を記録するたびに発生します。複数の行が含まれていました。レコードとフィールドの両方の区切り文字の衝突は、テキストファイルで頻繁に発生します。

状況によっては、悪意のあるユーザーまたは攻撃者がこの問題を意図的に悪用しようとする場合があります。したがって、区切り文字の衝突は、セキュリティの脆弱性悪用の原因となる可能性があります。悪意のあるユーザーは、SQLHTMLなどの言語での区切り文字の衝突を利用して、それぞれSQLインジェクションクロスサイトスクリプティングなどのよく知られた攻撃を展開できます。

ソリューション

区切り文字の衝突は非常に一般的な問題であるため、それを回避するためのさまざまな方法が発明されています。一部の作成者は、データストリーム自体に表示されない可能性のある区切り文字(または文字のシーケンス)を選択することにより、問題を回避しようとする場合があります。このアドホックなアプローチは適切かもしれませんが、それは必然的にデータストリームに何が表示されるかを正しく推測することに依存し、悪意のある衝突に対するセキュリティを提供しません。したがって、他のより正式な規則も適用されます。

ASCII区切りテキスト

ASCIIおよびUnicode文字セットは、区切り文字として使用できる非印刷文字を提供することにより、この問題を解決するように設計されています。これらはASCII28から31までの範囲です。

ASCII 12月 シンボル Unicode名 一般名 使用法
28 情報セパレーター4 ファイル区切り文字 ファイルの終わり。または、別のファイルである可能性があるものの連結間。
29 インフォメーションセパレーター3 グループ区切り文字 データのセクション間。単純なデータファイルでは必要ありません。
30 情報分離器2 レコード区切り文字 レコードまたは行の終わり。
31 インフォメーションセパレーター1 ユニットセパレータ レコードのフィールド間、または行のメンバー。

フィールドセパレータとしてASCII31ユニットセパレータを使用し、ASCII 30レコードセパレータを使用すると、テキストデータストリームに表示されるフィールド区切り文字とレコード区切り文字の両方の問題が解決されます。[19]

エスケープ文字

区切り文字の衝突を回避する1つの方法は、エスケープ文字を使用することです。言語設計の観点からは、これらは適切ですが、欠点があります。

  • 傾いた楊文字症候群と呼ばれる問題である、多数のエスケープ文字が散らばっている場合、テキストが読めなくなる可能性があります( Perl 正規表現で\を使用してエスケープするため、「\ / \ /」などのシーケンスが発生します)。
  • 正規表現によるテキストの解析が困難になります
  • エスケープ文字として意図されていない場合は、「エスケープをエスケープする」メカニズムが必要です。
  • 入力は簡単ですが、言語に不慣れな人にはわかりにくい場合があります。[20]
  • それらは注射攻撃から保護しません[要出典]

エスケープシーケンス

エスケープシーケンスはエスケープ文字に似ていますが、通常、単一の文字ではなく、ある種のニーモニックで構成されている点が異なります。1つの用途は、二重引用符( ")文字を含む文字列リテラルです。たとえば、Perlでは、次のコードを使用します。

印刷 「ナンシーは群衆に\ x22ハローワールド!\ x22と言った。」;   ### \ x22を使用

次と同じ出力を生成します。

印刷 「ナンシーは群衆に「HelloWorld!」と言った。」;       ###エスケープ文字を使用

エスケープシーケンスの欠点の1つは、人々が使用する場合、個々の文字を表すコードを記憶する必要があることです(文字エンティティ参照数値文字参照も参照)。

二重引用符の区切り文字

エスケープシーケンスやエスケープ文字とは対照的に、デュアル区切り文字は、区切り文字の衝突を回避するためのさらに別の方法を提供します。たとえば、一部の言語では、一重引用符( ')または二重引用符( ")を使用して、文字列リテラルを指定できます。たとえば、Perlでは次のようになります 。

print  'ナンシーは「HelloWorld!」と言った 群衆に。」;

エスケープを必要とせずに目的の出力を生成します。ただし、このアプローチは、文字列に両方のタイプの引用符 が含まれていない場合にのみ機能します。

引用符区切り文字のパディング

エスケープシーケンスやエスケープ文字とは対照的に、パディング区切り文字は、区切り文字の衝突を回避するためのさらに別の方法を提供します。たとえば、Visual Basicは、区切り文字として二重引用符を使用します。これは、区切り文字をエスケープするのと似ています。

 「ナンシーは群衆に「HelloWorld!」と言った」と印刷します。

エスケープを必要とせずに目的の出力を生成します。ただし、通常のエスケープと同様に、多くの引用符を使用すると混乱する可能性があります。上記のソースコードを印刷するコードは、より紛らわしいように見えます。

print  "print" "ナンシーは" "" "Hello World!" "" ""群衆に言った "" ""

構成可能な代替引用符区切り文字

デュアルデリミタとは対照的に、複数のデリミタは、デリミタの衝突を回避するためにさらに柔軟性があります。[7] :63 

たとえば、Perlでは:

print  qq ^ナンシーは「HelloWorld!」と言いたくありません。もう。^ ; 
print  qq @ Nancyは「HelloWorld!」と言いたくありません。もう。@ ; 
print  qq(ナンシーはもう「HelloWorld!」と言いたくない。);

すべて引用符演算子を使用して目的の出力を生成します。これにより、便利な文字を区切り文字として機能させることができます。この方法はより柔軟ですが、サポートしている言語はほとんどありません。PerlとRubyはその2つです。[7] :62  [21]

コンテンツ境界

コンテンツ境界は、区切り文字の衝突に抵抗するように特別に設計された特殊なタイプの区切り文字です。これは、作成者が、他の可能な解釈なしに、マルチパートメッセージ内のパート間の境界を常に示すことが保証されている文字のシーケンスを指定できるようにすることで機能します。[22]

区切り文字は、コンテンツで発生する可能性が統計的に低いランダムな文字シーケンスから生成されることがよくあります。この後に、 UUIDタイムスタンプ、またはその他の識別マークなどの識別マークが続く場合があります。または、コンテンツをスキャンして、テキストに区切り文字が表示されないようにすることもできます。これにより、区切り文字を短くしたり単純にしたりして、ドキュメントを人間が読みやすくすることができます。たとえばMIMEヒアドキュメントを参照してください)。

空白またはインデント

一部のプログラミングおよびコンピューター言語では、テキスト内の独立した領域間の境界を指定する手段として、空白の区切り文字またはインデントを使用できます。[23]

正規表現構文

正規表現を指定する際に、 Perlでの一致および置換操作の構文を単純化するために代替区切り文字を使用することもできます[24]

たとえば、Perlでは次の構文で単純な一致操作を指定できます。

$ string1  =  'ナンシーは「HelloWorld!」と言った 群衆に。」;     #ターゲット文字列を指定します
print  $ string1  = 〜m  / [aeiou] + / ;                            #1つ以上の母音に一致

構文は、代替の区切り文字を使用して一致操作を指定するのに十分な柔軟性があり、区切り文字の衝突を簡単に回避できます。

$ string1  =  'ナンシーは「http://Hello/World.htm」は有効なアドレスではないと述べました。;  #ターゲット文字列
   
print  $ string1  = 〜m  @ http:// @ ;        #代替正規表現区切り文字を使用して一致
print  $ string1  = 〜m  {http://} ;        #前と同じですが、区切り文字が異なり
ますprint  $ string1  = 〜m  !http://!;        #前と同じですが、区切り文字が異なります。

ヒアドキュメント

ヒアドキュメントでは、特別な終了シーケンスを記述することにより、任意のコンテンツを含めることができます。PHPbashスクリプトrubyperlなど、多くの言語がこれをサポートしています。ヒアドキュメントは、終了シーケンスが何であるかを説明することから始まり、そのシーケンスが新しい行の先頭に表示されるまで続きます。[25]

これがperlの例です:

印刷 << ENDOFHEREDOC ; 
「特定の文字」で文字列をエンコードするのは非常に困難です。

改行、コンマ、およびその他の文字は、区切り文字の衝突を引き起こす可能性があります。
ENDOFHEREDOC

このコードは次のように出力します。

「特定の文字」で文字列をエンコードするのは非常に困難です。

改行、コンマ、およびその他の文字は、区切り文字の衝突を引き起こす可能性があります。

特別な終了シーケンスを使用することにより、文字列にあらゆる種類の文字を使用できます。

ASCIIアーマー

ASCIIアーマーは、主にバイナリデータのテキストエンコーディングのメカニズムとして使用されます が、プログラミングおよびシステム管理の手法であり、状況によっては区切り文字の衝突を回避するのにも役立ちます。[26] [27]この手法は、より複雑であり、したがって小さなアプリケーションや単純なデータストレージ形式には適していないため、上記の他のアプローチとは対照的です。この手法では、base64などの特別なエンコード方式を採用して、区切り文字やその他の重要な文字が送信データに表示されないようにします。目的は、多層エスケープを防ぐことです。つまり、ダブルクォートの場合です。

この手法は、たとえばMicrosoftASP.NET Web開発テクノロジで使用されており、そのシステムの「VIEWSTATE」コンポーネントと密接に関連しています。[28]

次の簡略化された例は、この手法が実際にどのように機能するかを示しています。

最初のコードフラグメントは、VIEWSTATE値にHTMLタグ自体の区切り文字と互換性のない文字が含まれて いる単純なHTMLタグを示しています。

<input  type = "hidden"  name = "__VIEWSTATE"  value = "BookTitle:Nancyは" Hello  World! "を もう言いません。"  />

この最初のコードフラグメントは整形式ではないため、「実世界」で展開されたシステムでは正しく機能しません。

HTML属性に任意のテキストを格納するには、HTMLエンティティを使用できます。この場合、「&quot;」二重引用符の代わりに:

<input  type = "hidden"  name = "__VIEWSTATE"  value = "BookTitle:Nancyは「HelloWorld!」をもう言いません。"  />

または、base64など、コンテキストで特別な意味を持つ文字を含まない任意のエンコーディングを使用できます。

<input  type = "hidden"  name = "__VIEWSTATE"  value = "Qm9va1RpdGxlOk5hbmN5IGRvZXNuJ3Qgc2F5ICJIZWxsbyBXb3JsZCEiIGFueW1vcmUu"  />

またはパーセントエンコード

<input  type = "hidden"  name = "__VIEWSTATE"  value = "BookTitle:Nancy%20doesn%27t%20say%20%22Hello%20World!%22%20anymore。"  />

これにより、区切り文字の衝突が防止され、元の(デコードされた)テキストに表示される文字に関係なく、互換性のない文字がHTMLコード内に表示されなくなります。[28]

も参照してください

参考文献

  1. ^ 「定義:区切り文字」連邦規格1037C-電気通信:電気通信用語集2013-03-05にオリジナルからアーカイブされました2019年11月25日取得
  2. ^ 「区切り文字とは何ですか?」www.computerhope.com 2020年8月9日取得
  3. ^ Rohl、Jeffrey S.(1973)。Fortranでのプログラミングオックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-7190-0555-8Fortranプログラミング言語でホレリス表記でメソッドを記述します。
  4. ^ a b de Moor、Georges J.(1993)。医療情報学における標準化の進歩IOSプレス。ISBN 90-5199-114-2p。141
  5. ^ フリードル、ジェフリーEF(2002)。正規表現の習得:Perlおよびその他のツールのための強力なテクニックオライリー。ISBN 0-596-00289-0p。319
  6. ^ スコット、マイケル・リー(1999)。プログラミング言語語用論モーガンカウフマン。ISBN 1-55860-442-1
  7. ^ a b c 壁、ラリー; Orwant、Jon(2000年7月)。Perlのプログラミング(第3版)。オライリー。ISBN 0-596-00027-8
  8. ^ カウフマン、マット(2000)。コンピュータ支援推論:アプローチスプリンガー。ISBN 0-7923-7744-3p。3
  9. ^ Meyer、Mark(2005)。コンピュータサイエンスの探求オックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-7637-3832-7中括弧とセミコロンを目立つように備えたCスタイルのプログラミング言語を参照します。
  10. ^ ディリガン、ロバート(1998)。Web時代のコンピューティングオックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-306-45972-6HTMLで使用される構文と区切り文字について説明します。
  11. ^ a b Schwartz、Randal(2005)。Perlの学習オックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-596-10105-3文字列リテラルについて説明します
  12. ^ ワット、アンドリュー(2003)。Samsは10分で自分自身にXmlを教えます。オックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-672-32471-0XML処理命令について説明します。p。21。
  13. ^ カブレラ、ハロルド(2002)。Javaプログラマー向けのC#オックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-1-931836-54-81行および複数行のコメントについて説明します。p。72。
  14. ^ 「Smartyテンプレートドキュメント」2010年3月12日取得たとえば、Smartyテンプレートシステムのドキュメント「エスケープテンプレート区切り文字」を参照してください。
  15. ^ 「ISO646の制御文字のセット」(PDF)国際標準化機構。1975年12月1日。
  16. ^ 「ASCIIグラフィック文字セット」(PDF)国際標準化機構。1975年12月1日。
  17. ^ Lewine、Donald(1991)。Posixプログラマーガイドオックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-937175-73-6control-zp156の使用について説明します。
  18. ^ フリードル、ジェフリー(2006)。正規表現の習得オックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-596-52812-6埋め込み区切り文字の問題の解決策を説明するp。472。
  19. ^ ASCII区切りテキストとCSVおよびタブ区切りに関するディスカッション
  20. ^ Kahrel、Peter(2006)。正規表現を使用したInDesignの自動化オライリー。ISBN 0-596-52937-6p。11
  21. ^ まつもとゆきひろ(2001)。一言で言えばRubyオライリー。ISBN 0-596-00214-9Rubyでは、これらは一般的な区切り文字列として示されます。p。11
  22. ^ ネットワークプロトコルハンドブックJavvin Technologies Inc. 2005. ISBN 0-9740945-2-8p。26
  23. ^ 計算言語学とインテリジェントテキスト処理オックスフォードオックスフォードシャー:オックスフォード大学出版局。2001年。ISBN 978-3-540-41687-6空白の区切り文字について説明します。p。258。
  24. ^ フリードル、ジェフリー(2006)。正規表現の習得オックスフォードオックスフォードシャー:オックスフォード大学出版局。ISBN 978-0-596-52812-6472ページ。
  25. ^ Perl演算子と優先順位
  26. ^ Rhee、Man(2003)。インターネットセキュリティ:暗号化の原則、アルゴリズム、プロトコルジョン・ワイリーとサンズ。ISBN 0-470-85285-2(暗号化アプリケーションでのASCIIアーマーの使用例)
  27. ^ グロス、クリスチャン(2005)。Windows管理者向けのオープンソースチャールズリバーメディア。ISBN 1-58450-347-5(暗号化アプリケーションでのASCIIアーマーの使用例)
  28. ^ a b Kalani、Amit(2004)。Visual C#を使用したWebアプリケーションの開発と実装。NETおよびVisualStudio。NETキュー。ISBN 0-7897-2901-6(HTMLソースコード内でのBase64エンコーディングとVIEWSTATEの使用について説明しています)

外部リンク