Real World Haskell 부록 B 번역: 문자, 문자열, 이스케이프 규칙Real World Haskell 부록 B 번역: 문자, 문자열, 이스케이프 규칙

Posted at 2015.02.01 23:45 | Posted in 지식저장소/읽은 책 요약
부록 B. 문자, 문자열, 이스케이프 규칙

부록 B. 문자, 문자열, 이스케이프 규칙

이 부록은 비 아스키 문자를 하스켈 문자와 문자열에 사용하는 이스케이프 규칙을 다룹니다. 하스켈의 이스케이프 규칙은 C언어에서 쓰는 방식을 따르지만, 거기에 대해 좀 부연하겠습니다.

문자와 문자열 나타내기

아스키 작은 따옴표 '로 감싼 문자 하나는 Char 타입을 가집니다.

ghci> 'c'
'c'
ghci> :type 'c'
'c' :: Char

문자열 상수는 큰 따옴표 "로 감싸고, [Char] 타입을 가집니다 (보통 String으로 씁니다).

ghci> "a string literal"
"a string literal"
ghci> :type "a string literal"
"a string literal" :: [Char]

큰따옴표 문자열은 단지 리스트 표기법의 설탕 구문입니다.

ghci> ['a', ' ', 's', 't', 'r', 'i', 'n', 'g'] == "a string"
True

다국어 지원

하스켈은 Char 데이터 타입을 위해 내부적으로 유니코드를 사용합니다. String[Char], 즉 Char 리스트이기에 문자열에도 또한 유니코드를 씁니다.

각각의 하스켈 구현은 소스 파일에서 쓸 수 있는 문자 집합에 제한을 둡니다. GHC는 UTF-8 소스파일을 허용하기에 문자나 문자열 상수로 UTF-8 상수를 쓸 수 있습니다. UTF-8을 소스파일에 쓰면 다른 하스켈 구현은 파싱할 수 없을 수도 있기에 유의해야 합니다.

ghci 인터프리터를 실행 중일 땐 키보드로 입력한 비아스키 문자나 문자열은 잘 다루지 못할 수도 있습니다.

유의

하스켈이 문자와 문자열을 유니코드로 다룬다지만, 유니코드 데이터를 담은 파일에 대한 입출력 방법은 표준화되지 않았습니다. 하스켈의 표준 입출력 함수는 텍스트를 8비트 문자의 나열로 간주하고, 그 어떤 문자 집합 변환도 수행하지 않습니다.

파일에 쓰는 다양한 인코딩과 하스켈의 내부 유니코드 간 변환을 해주는 서드 파티 라이브러리도 있습니다.

텍스트 이스케이핑

일부 문자는 문자나 문자열 상수로 표현할 때 반드시 이스케이프되어야 합니다. 예를 들어, 큰따옴표 문자는 문자열 안에서 이스케이프하지 않으면 문자열의 끝으로 간주되기 때문에 이스케이프가 필요합니다.

단일 문자 이스케이프 코드

하스켈은 기본적으로 C언어와 다른 유명한 언어의 단일 이스케이프 문자를 사용합니다.

표 B.1. 단일 문자 이스케이프 코드

이스케이프 유니코드 문자
\0 U+0000 널 문자
\a U+0007 비프음
\b U+0008 백스페이스
\f U+000C 폼 피드
\n U+000A 개행 (라인 피드)
\r U+000D 커리지 리턴
\t U+0009 수평 탭
\v U+000B 수직 탭
\" U+0022 큰따옴표
\& n/a 빈 문자열
\' U+0027 작은 따옴표
\\ U+005C 백슬래시

여러 줄 문자열 상수

여러 줄에 걸쳐 문자열을 쓰고 싶을 땐, 한 줄을 백슬래시로 끝내고, 다시 백슬래시로 문자열을 시작하면 됩니다. 아무 종류의 공백이든 두 백슬래시 사이에 넣어도 됩니다.

"this is a \
  \long string,\
    \ spanning multiple lines"

아스키 제어 문자

하스켈은 두 글자나 세 글자의 아스키 제어문자 약어를 인식합니다.

표 B.2. 아스키 제어 문자 약어

이스케이프 유니코드 의미
\NUL U+0000 널 문자
\SOH U+0001 start of heading
\STX U+0002 start of text
\ETX U+0003 end of text
\EOT U+0004 end of transmission
\ENQ U+0005 enquiry
\ACK U+0006 acknowledge
\BEL U+0007 bell
\BS U+0008 백스페이스
\HT U+0009 수평 탭
\LF U+000A 라인 피드 (개행)
\VT U+000B 수직 탭
\FF U+000C 폼 피드
\CR U+000D 커리지 리턴
\SO U+000E 시프트 아웃
\SI U+000F 시프트 인
\DLE U+0010 data link escape
\DC1 U+0011 device control 1
\DC2 U+0012 device control 2
\DC3 U+0013 device control 3
\DC4 U+0014 device control 4
\NAK U+0015 negative acknowledge
\SYN U+0016 synchronous idle
\ETB U+0017 end of transmission block
\CAN U+0018 cancel
\EM U+0019 end of medium
\SUB U+001A substitute
\ESC U+001B escape
\FS U+001C file separator
\GS U+001D group separator
\RS U+001E record separator
\US U+001F unit separator
\SP U+0020 스페이스
\DEL U+007F delete

컨트롤 첨부 문자 이스케이프

하스켈은 키보드의 컨트롤키를 다른 키와 같이 눌렀을 때 나오는 옛날 나오던 문자를 연상시키는, 제어 문자에 대한 다른 표기법을 인식합니다. 이 시퀀스는 \^ 뒤에 기호나 알파벳 대문자가 따라옵니다.

표 B.3. 컨트롤 문자 코드

이스케이프 유니코드 의미
\^@ U+0000 널 문자
\^A에서 \^Z까지 U+0001에서 U+001A까지 제어 코드
\^[ U+001B escape
\^\ U+001C file separator
\^] U+001D group separator
\^^ U+001E record separator
\^_ U+001F unit separator

숫자 이스케이프

하스켈에선 숫자 이스케이프로 유니코드 문자를 표현할 수 있습니다. 10진 문자는 숫자 문자로 시작하고(예: \1234), 16진 문자는 x로 시작하고(예: \xbeef), 8진 문자는 o로 시작합니다(예: \o1234).

숫자 이스케이프의 최대 값은 \1114111이고, \x10ffff\o4177777와 같습니다.

너비 없는 이스케이프 시퀀스

문자열 상수는 \&로 쓰는 폭이 없는 이스케이프 시퀀스를 포함할 수 있습니다. 이건 실제 문자가 아니고, 빈 문자열을 나타냅니다.

ghci> "\&"
""
ghci> "foo\&bar"
"foobar"

이 이스케이프 시퀀스는 숫자 이스케이프 다음에 곧바로 아스키 숫자를 쓰는 걸 가능하게 만들기 위해 있는 것입니다.

ghci> "\130\&11"
"\130\&11"

빈 이스케이프 시퀀스는 빈 문자열을 나타내기 때문에 적법한 문자 상수는 아닙니다.

저작자 표시 비영리 동일 조건 변경 허락
신고