{{위키데이터 속성 추적}}
{{번역 중|en:Delimiter}}
[[파일:csv delimited000.svg|섬네일|오른쪽|200px|CSV 텍스트 파일에서는 쉼표(빨간색)가 필드 구분자로 사용된다.]]

'''구분 문자'''({{llang|en|Delimiter}})는 일반 텍스트 또는 데이터 스트림에서 별도의 독립적 영역 사이의 경계를 지정하는 데 사용하는 하나의 문자 혹은 문자들의 배열을 말한다.<ref>{{웹 인용 |url=http://www.its.bldrdoc.gov/fs-1037/dir-011/_1544.htm |제목=Federal Standard 1037C ''delimiter''  |확인날짜=2014-01-28 |보존url=https://web.archive.org/web/20130305032313/http://www.its.bldrdoc.gov/fs-1037/dir-011/_1544.htm |보존날짜=2013-03-05 |url-status=dead }}</ref> 구분 문자의 한 예로 쉼표가 있는데, CSV(comma-separated values) 파일의 필드 구분자의 역할을 한다.

영어로 Delimit이 "범위(한계)를 정하다"라는 의미이다. 공식 문서에서는 'delim'와 같은 약어로 표시되기 때문에 주의가 필요하다.

예를 들어 istream& getline (istream& is, string& str, char delim); 와 같이 표시가 된다.

구분 문자는 데이터 스트림의 경계를 지정하는 다양한 방법 중 하나이다. 예를 들어, 선언적 표기법(Declarative notation)은 데이터 경계를 지정하는 다른 방법으로서, 데이터 스트림이 시작할 때 길이 필드에 그 스트림에 포함된 문자의 수를 지정하여 데이터의 경계를 지정한다.<ref name="hollerity">{{서적 인용| last = Science | first = By | title = Programming in Fortran | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 1973 | isbn = 978-0-7190-0555-8}}</ref>

== 개요 ==
구분 문자는 다음과 같이 나눌 수 있다.:

* [[필드]]/[[레코드]] 구분 문자
* 영역 구분 문자

=== 필드와 레코드 구분 문자 ===
필드 구분 문자는 데이터 필드를 분리한다. 레코드 구분 문자는 필드들의 그룹을 분리한다.<ref name="FldDelm">{{서적 인용| last = de Moor | first = Georges J. | title = Progress in Standardization in Health Care Informatics | publisher =IOS Press | year = 1993 | isbn =90-5199-114-2}} p. 141</ref>

예를 들어, CSV 파일 형식은 필드 간의 구분 문자로서 쉼표를 사용하고 레코드 사이의 구분자로는 줄바꿈(end-of-line) 문자를 사용한다. 다음의 예를 보자.
<syntaxhighlight lang="text">
성,이름,나이,연봉
김,영희,33,₩30000000
홍,길동,28,₩25250000
이,철수,35,₩28700000
</syntaxhighlight>
이 예는 CSV 파일 형식을 사용하여 간단한 [[플랫 파일 데이터베이스]] [[표|테이블]]을 표현한다.

=== 영역 구분 문자 ===

영역 구분 문자(혹은 블록 구분 문자, 괄호 구분 문자)는 텍스트 영역의 시작과 끝을 모두 표시한다.<ref name="BalaDelm">{{서적 인용| last = Friedl | first = Jeffrey E. F. | title = Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools | publisher = O'Reilly | year = 2002| isbn = 0-596-00289-0}} p. 319</ref><ref name="Scott000">{{서적 인용
| title     = Programming Language Pragmatics
| first     = Michael Lee
| last      = Scott
| publisher = Morgan Kaufmann
| year      = 1999
| isbn      = 1-55860-442-1
}}</ref>

영역 구분 문자의 일반적인 예는 다음과 같다.<ref name="programmingperl">{{서적 인용| title=Programming Perl, Third Edition | author=[[Larry Wall|Wall, Larry]], Tom Christiansen and [[Jon Orwant]] | publisher=O'Reilly | month=July | year=2000 | isbn=0-596-00027-8}}</ref>
{| class="wikitable"
|-
!구분 문자
! style="text-align:left"|설명
|-
|  <code>(</code> and <code>)</code>
|  괄호. [[리스프]] 프로그래밍 언어의 문법에서는 주로 이 괄호를 사용하여 인식한다.<ref name="Kaufmann000">{{서적 인용
| title     = Computer-Aided Reasoning: An Approach
| first     = Matt
| last      = Kaufmann
| publisher = Springer
| year      = 2000
| isbn      = 0-7923-7744-3
}}p. 3</ref>
|-
|  <code>{</code> and <code>}</code>
| 중괄호 (혹은 컬리 브래킷<ref name="curly_brace_cstyle">{{서적 인용| last = Meyer | first = Mark | title = Explorations in Computer Science | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 2005 | isbn = 978-0-7637-3832-7 }}컬리 브래킷과 세미콜론이 특징인  C-스타일 프로그래밍 언어를 참조.</ref> )

|-
|  <code>[</code> and <code>]</code>
| 대괄호 (일반적으로 첨자를 나타내기 위해 사용된다.)
|-
|  <code><</code> and <code>></code>
|  꺾쇠 괄호<ref name="id_1268443793898_27">{{서적 인용| last = Dilligan | first = Robert | title = Computing in the Web Age | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 1998 | isbn = 978-0-306-45972-6 }}HTML에서 사용되는 문법과 구분 문자들을 설명.</ref>
|-
|  <code>"</code> and <code>"</code>
| 일반적으로 문자열을 나타내기 위해 사용된다.<ref name="id_1268443910269_75">{{서적 인용| last = Schwartz | first = Randal | title = Learning Perl | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 2005 | isbn = 978-0-596-10105-3 }} 문자열을 설명.</ref>
|-
|  <code>'</code> and <code>'</code>
| 일반적으로 문자열을 나타내기 위해 사용된다.<ref name="id_1268443910269_75"/>
|-
|  <code><?</code> and <code>?></code>
| XML 처리 명령어 표시에 사용된다.<ref name="id_1268443998814_32">{{서적 인용| last = Watt | first = Andrew | title = Sams Teach Yourself Xml in 10 Minutes | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 2003 | isbn = 978-0-672-32471-0 }} XML 처리 명령을 설명. P. 21.</ref>
|-
|  <code>/*</code> and <code>*/</code>
| 일부 프로그래밍 언어의 주석을 나타내기 위해 사용된다.<ref name="id_1268444112328_77">{{서적 인용| last = Cabrera | first = Harold | title = C# for Java Programmers | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 2002 | isbn = 978-1-931836-54-8 }} single-line 과 multi-line comments를 설명. P. 72.</ref>
|-
|  <code><%</code> and <code>%></code>
| 언어의 경계를 지정하는 일부 웹 템플릿들에 사용된다. 이들은 또한 ''템플릿 구분 문자'' 로도 불린다.<ref name="smarty_templ_delimiter_term">{{웹 인용
| title      = Smarty Template Documentation
| url        = http://www.smarty.net/manual/en/language.function.ldelim.php
| accessdate = 2010-03-12<!-- 16:53:02
-->}} See e.g., Smarty template system documentation, "escaping template delimiters".</ref>
|}

==== 규약 ====

컴퓨팅 플랫폼은 역사적으로 관례에 따라, 특정한 구분 문자를 사용한다.<ref>
International Organization for Standardization (December 1, 1975). "[http://www.itscj.ipsj.or.jp/ISO-IR/001.pdf The set of control characters for ISO 646] {{웨이백|url=http://www.itscj.ipsj.or.jp/ISO-IR/001.pdf |date=20120729193430 }}". ''Internet Assigned Numbers Authority Registry'' . Alternate U.S. version: [http://www.itscj.ipsj.or.jp/ISO-IR/006.pdf ] {{웨이백|url=http://www.itscj.ipsj.or.jp/ISO-IR/006.pdf |date=20060305121105 }}. Accessed August 7, 2005.
</ref> 다음의 표가 비교를 위한 몇 가지 예를 보여준다.

'''프로그래밍 언어'''
''(같이 보기'' , 프로그래밍 언어 (문법)의 비교)
{| class="wikitable"
!
!문자열
!명령문의 끝
|-
!파스칼
| 작은따옴표
| 세미콜론
|-
!C
| 작은따옴표, 큰따옴표

| 세미콜론
|-
|}

'''필드와 레코드 구분 문자''' ''(참고: [[미국 정보 교환 표준 부호|ASCII]], [[제어 문자]]).

{| class="wikitable"
!
!필드의 끝
!레코드의 끝
!파일의 끝
|-
! Unix, Mac OS X, Amiga OS
|  Tab
|  LF
|  none
|-
! Windows, MS-DOS, OS/2, CP/M
|  Tab
|  CRLF
|  Control-Z<ref name="id_1268444696385_5">{{서적 인용| last = Lewine | first = Donald | title = Posix Programmer's Guide | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 1991 | isbn = 978-0-937175-73-6 }} control-z의 사용을 설명. p.156</ref>
|-
! Classic Mac OS, AppleDOS, ProDOS, GS/OS
|  Tab
|  CR
|  none
|-
! ASCII/Unicode
|  UNIT SEPARATOR<br>Position 31 (U+001F)
|  RECORD SEPARATOR<br>Position 30 (U+001E)
|  FILE SEPARATOR<br>Position 28 (U+001C)
|}

=== 구분 문자 충돌 ===
구분 문자 충돌은 작성자나 프로그래머가 구분자를 별도의 영역 사이의 경계로 해석하려는 의도 없이 텍스트에 구분자를 도입할 때 발생하는 문제이다.<ref name="mre_embed_problem">{{서적 인용| last = Friedl | first = Jeffrey | title = Mastering Regular Expressions | publisher = Oxford University Press | location = Oxford Oxfordshire | year = 2006 | isbn = 978-0-596-52812-6 }} describing solutions for embedded-delimiter problems p. 472.</ref> 예를 들어 XML의 경우 작성자가 꺾쇠 [[괄호]] 문자를 지정하려고 할 때마다 이런 일이 발생할 수 있다.

대부분의 파일 유형에는 필드 구분 기호와 레코드 구분 기호가 모두 있으며 둘 다 충돌할 수 있다. 예를 들어, [[CSV (파일 형식)]] 파일의 경우 작성자가 필드 값의 일부로 쉼표를 포함하려고 시도할 때마다(예: salary = "$30,000") 필드 충돌이 발생할 수 있으며 필드 충돌이 발생할 때마다 레코드 구분 기호 충돌이 발생할 수 있다. 여러 줄이 포함되어 있다. 레코드와 필드 구분 기호 충돌은 모두 텍스트 파일에서 자주 발생한다.

어떤 상황에서는 악의적인 사용자나 공격자가 이 문제를 의도적으로 악용하려고 할 수도 있다. 결과적으로 구분 기호 충돌은 [[보안 취약점]] 및 [[취약점 공격|악용]]의 원인이 될 수 있다. 악의적인 사용자는 [[SQL]] 및 [[HTML]]과 같은 언어의 구분 기호 충돌을 활용하여 각각 [[SQL 삽입]] 및 [[사이트 간 스크립팅]]과 같은 잘 알려진 공격을 배포할 수 있다.

===해결책===
구분자 충돌은 매우 일반적인 문제이기 때문에 이를 방지하기 위한 다양한 방법이 개발되었다. 일부 작성자는 데이터 스트림 자체에 나타날 가능성이 없는 구분 기호 문자(또는 문자 시퀀스)를 선택하여 문제를 방지하려고 시도할 수 있다. 이 임시 접근 방식은 적합할 수 있지만 반드시 데이터 스트림에 나타날 내용에 대한 정확한 추측에 따라 달라지며 악의적인 충돌에 대한 보안을 제공하지 않는다. 따라서 다른 보다 공식적인 규칙도 적용된다.

== 같이 보기 ==
* [[:en:Delimiter-separated values|영어 위키백과 문서]]
* [[:en:String literal|문자열 리터럴 (영문)]]

== 각주 ==
{{각주|2}}

== 외부 링크 ==
* [http://www.catb.org/esr/writings/taoup/html/ch05s02.html Data File Metaformats] from The Art of Unix Programming by Eric Steven Raymond

[[분류:마크업 언어]]
[[분류:패턴 매칭]]
[[분류:프로그래밍 구성체]]
[[분류:문자열]]