Chap.2 언어의 표현 - 문자와 문자열

Objectives

• 언어의 표현: 문자(character) > 단어 > 문장

- 문자 코드: 어떤 방식으로 사람의 ‘문자’를 컴퓨터 ‘bits’로 저장할 것인가?

• 영어

- ASCII (American Standard Code for Information Exchange)

1 byte: 1 parity bit + 7 bits

http://en.wikipedia.org/wiki/Ascii : Character Encodings

- [부록 1] p.666-668, [C 콘서트] p.102

- 제어문자, 알파벳, 숫자, 특수기호로 구성됨

• 한글: 완성형/조합형

e.g., KPS 9566, KS X 1001, EUC-KR, UTF-8

문자: 영문자

• ASCII: PPT 참조

/* sample7.c */

#include <stdio.h>

main()

{

char sign;

sign =‘A’;

printf(“The value of A is %d.\n”, sign);	// 정수형 출력

printf(“The character of A is %c.\n“, sign);	// 문자형 출력

}

- [부록 5] p.681

- [본문] p.19 : ASCII 코드의 표준 집합 출력 (32~126까지, ASCII: 0-127)

[PPT 2-1] #4 예제 1-1-1

http://ko.wikipedia.org/wiki/KS_X_1003

- [본문] p.20 : ASCII 코드의 확장 집합 출력 (128~254까지),

터미널의 문자집합이 그래픽/한글모드(CP 949)에서는 출력되지 않음

- [본문] p.21 : ASCII 코드의 확장 집합 출력,

영문텍스트 모드(CP 437)로 변환 후 정상적으로 출력

[PPT 2-1] #5 예제 1-1-3

e.g.,  터미널/프로그램이 어떠한 문자코드 집합을 지원하는가?

1) Linux:

PuTTy > Change Settings > Translation > CP437

PuTTy > Change Settings > Translation > UTF-8

2) MS-Windows: 명령프롬프트 (DOS)

DOS> chcp 437 // 영문텍스트 모드 전환 (graftabl 437)

DOS> chcp 949 // 그래픽모드/한글모드 전환 (graftabl 949)

http://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%ED%8E%98%EC%9D%B4%EC%A7%80_437

3) Web Browser:

- IE (Chrome은 manual encoding 메뉴를 제거함)

문자: 한글

• 2 bytes 이상 필요:

- 조합형/완성형, 확장완성형(CP949/EUC-KR), 유니코드(Unicode), UTF-8

e.g., DOS> chcp 437 // 영문텍스트 모드 전환, 한글입력 불가

DOS> chcp 949 // 그래픽모드/한글모드 전환, 한글입력 가능

• 조합형/완성형: [PPT 2-1] 참조

- [본문] p.22 : 한글 코드의 종류

- 조합형: 두번째 byte의 최상위 bit가 0이면 ASCII의 통신제어코드와 충돌

e.g., HWP의 HNC 코드에서 사용

0   ASCII char.

- 완성형: KSC 5601 - 국가 표준으로 채택 (1987)

사용빈도가 높은 2,350자, 한자 4,888자, 특수문자 986자

• 확장 완성형

http://ko.wikipedia.org/wiki/%ED%95%9C%EA%B8%80_%EC%83%81%EC%9A%A9_%EC%A1%B0%ED%95%A9%ED%98%95_%EC%9D%B8%EC%BD%94%EB%94%A9 (조합형)

http://ko.wikipedia.org/wiki/%EB%B3%B4%EC%84%9D%EA%B8%80 (완성형)

http://ko.wikipedia.org/wiki/KS_X_1001

• 확장완성형

- Windows 98부터 사용: CP 949

Unix/Linux: EUC-KR (Extended Unix Code)

c.f., HWP: 고유의 HNC 코드 사용

- EUC-KR 출력: http://ko.wikipedia.org/wiki/EUC-KR

e.g., '가‘ = 0xb0 0xa1, '위‘ = 0xc0 0xa7

/* 1-2-euc.c - EditPlus에서 ANSI로 저장                             */

/* Linux의 Putty Translation(character set): ‘Use font encoding’ 사용 */

#include <stdio.h>

int main(void)

{

unsigned char b1=0xb0;

unsigned char b2=0xa1;

unsigned char b3=0xc0;

unsigned char b4=0xa7;

printf("%c%c\n", b1, b2);

printf("%c%c\n", b3, b4);

return 0;

}

• EUC-KR은 KS X 1001와 KS X 1003을 사용하는 8비트 문자 인코딩으로, EUC의 일종이며 대표적인 한글 완성형 인코딩이기 때문에 보통 완성형이라고 불린다.

• EUC-KR 인코딩은 다음과 같이 구성된다.

- 128(10000000)보다 작은 바이트에 KS X 1003을 배당한다.

- 128(10000000)보다 크거나 같은 바이트에 KS X 1001을 배당한다.

e.g., KS X 1001의 40-27에 배당된 "위"라는 글자는

[0 1 0 0 0 0 0 0] [0 0 1 0 0 1 1 1]

128[1 0 0 0 0 0 0 0]을 더하여 EUC-KR에서 [C0] [A7]라는 바이트 열로 표현된다.

[1 1 0 0 0 0 0 0] [1 0 1 0 0 1 1 1]

• 128[1 0 0 0 0 0 0 0]을 더하면 byte의 최상위 bit가 1이 되므로 ASCII 코드와 충돌하지 않는다.

• 한글 표현 갯수:

- KS X 1001의 글자 표현 갯수

[A1][A1] ~ [FE][FE]: 94×94 = 8,836자 (특수문자/한글/한자)

(i.e., [161][161] ~ [254][254])

- 한글 표현 개수: 2,350자

('가‘ = 0xb0 0xa1) ~ ('힝‘ = 0xc8 0xFE)

http://comedudb6.knue.ac.kr/tykim/Myhome/Cnote/chap2-KSX1001Hangul.pdf

- Windows 98부터 사용: CP 949

http://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%ED%8E%98%EC%9D%B4%EC%A7%80_949

- [부록 4.1] p.671 - 한글 낱자에 각각 고유의 코드가 부여되어 있음

- [본문] p.23 : 확장 완성형 한글 코드: 2 bytes 문자열

p.23 완성형 한글 코드 출력

[PPT 2-1] #9 예제 1-2-1        // 배열:문자열(string, “가”)이므로 마지막에

char hangul[3]="가";        //       NULL('\0') 문자가 들어감...

/* 1-2-1.c - EditPlus에서 ANSI로 저장                             */

/* Linux의 Putty Translation(character set): ‘Use font encoding’ 사용 */

#include <stdio.h>

int main(void)

{

char hangul[3]="가";

unsigned char code;

code=hangul[0];

printf("%x %d\n", code, code);

code=hangul[1];

printf("%x %d\n", code, code);

return 0;

}

- [본문] p.24 : ‘가’ (2 bytes 문자열) 출력

p.24 : ‘힝’ (2 bytes 문자열) 출력

[PPT 2-1] #10 예제 1-2-2

[PPT 2-1] #10 예제 1-2-3

- [본문] p.25 : '가‘로부터 완성형 한글코드 출력

[PPT 2-1] #11 예제 1-2-4

/* 1-2-4.c - EditPlus에서 ANSI로 저장                             */

/* Linux의 Putty Translation(character set): ‘Use font encoding’ 사용 */

#include <stdio.h>

int main(void)

{

// unsigned char b1=0xb0;

unsigned char b1=176;

unsigned char b2;

for(b2=0xa1;b2<=0xaa;b2++)

{

printf("%c%c%2x%2x ", b1, b2, b1, b2);

if (b2%5==0)

printf("\n");

}

printf("\n");

return 0;

}

• Unicode

- 플랫폼(OS)/프로그램에 따라 문자 코드가 다를 수 있다.

e.g., Windows : ISO 2022-KR (KSC 5601), CP949

Unix/Linux: EUC-KR

HWP

⇒ 문자 코드의 난립

⇒ 호환성 문제 (문자가 깨지거나 알 수 없는 문자가 출력되는 경우)

e.g., PuTTy

- 전세계 공통적으로 사용할 수 있는 문자 코드의 집합이 필요

⇒ 각 나라에서 사용되고 있는 문자들을 코드화

⇒ Unicode 컨소시움 (Apple, IBM, MS 등)

⇒ ISO(국제 표준화기구)와 IEC(국제 전기표준회의): ISO/IEC 10646

http://en.wikipedia.org/wiki/ISO/IEC_10646

http://ko.wikipedia.org/wiki/ISO/IEC_10646

- 16 bits: 전세계에서 사용되고 있는 26개 언어의 문자/특수기호에 대하여 일일이 코드값을 부여 (216 = 65,536자)

e.g., 한자 39.89%, 한글 17.04%, ASCII/기호 10.39%

- Unicode 2.0(1997)에는 현대 한글 11,172자에 대한 코드값이 모두 할당되어 있음.

⇒ (11,172자/65,536자) = 17.04%

⇒ KSC 5700으로 지정

- Unicode 3.0: 24 bits 사용  (224 = 16,777,216자)

e.g., Windows 2000: Unicode 3.0 지원

Windows XP: Unicode 3.1 지원

e.g., HWP: 2000년 이후 발표된 제품들(워디안/2002 이후 버전)은 고유의 HNC 코드가 아닌 유니코드를 기본으로 사용

1989: □글 1.0 - □글 1.5

HNC10 코드: 16 bit, 조합형 한글, 한자 KS 4888자

1993: □글 2.0, □글 2.1, □글 2.5

HNC20 코드: 16 bit, +옛한글, +확장한자 10880자, +KS 도형문자

DOS 운영체제 기반

1995: □글 3.0, □글 96, □글 97

HNC21 코드: 16 bit, 조합형 한글, HNC 코드에 일부 추가

Windows 3.x 운영체제 기반

2000: 워디안, □글 2002 - □글 2010

유니코드 시스템, Windows 9x/XP 운영체제 기반

HWP 2002(SE): 유니코드 3.0을 기반으로 작동

HWP 2005 이후버전: 유니코드 3.1을 기반

• UTF-8 (8-bit Unicode Transformation Format)

- 웹(WWW)에서 사용

- 유니코드를 위한 가변길이 문자 인코딩 (variable-length character encoding) 방식 (by Ken Thompson & Rob Pike)

http://en.wikipedia.org/wiki/Utf-8

http://ko.wikipedia.org/wiki/Utf-8

e.g., 예를 들어서, 문자 "위"(U+C704)는 다음과 같은 방법으로 UTF-8로 인코딩된다.

이 문자는 U+0800부터 U+FFFF 사이의 영역에 있으므로, 표에 따라 1110xxxx 10xxxxxx 10xxxxxx 형식으로 인코딩된다.

16진수 C704는 2진수 1100-0111-0000-0100와 같다.

이 비트들은 순서대로 x로 표시된 비트에 들어 간다: 11101100 10011100 10000100

결과적으로 이 문자는 3바이트로 인코딩되며, 16진수로 표시하면 EC 9C 84가 된다.

- 유니코드 1문자를 표현하기 위하여 1 byte ~ 4 byte를 사용

e.g., 영어/숫자는 1 byte, 한글/한자 3 byte

http://www.utf8-chartable.de/    // Hangul Syllables (U+AC00...U+D7AF)

e.g., ‘위’ (U+C704): EC 9C 84

- 'EditPlus' 편집기/'Putty' 터미널/웹 브라우저에서는 한글 문자코드를 선택 가능.

⇒ 'Use font encoding'/'ANSI' (EUC-KR/CP 949)/한국어 혹은 UTF-8

/* 1-2-1-utf8.c - EditPlus에서 'utf-8'로 저장                      */

/*                '가','위': euc-kr 값과는 다르게 저장됨            */

/* Linux의 Putty Translation(character set): ‘utf-8’로 보아야 함   */

#include <stdio.h>

int main(void)

{

char hangul1[4]="가";	// 문자열(string, “가”)이므로 마지막에

char hangul2[4]="위";        // NULL('\0') 문자가 들어감...

unsigned char code;

code=hangul1[0];

printf("%x %d\n", code, code);

code=hangul1[1];

printf("%x %d\n", code, code);

code=hangul1[2];

printf("%x %d\n\n", code, code);

code=hangul2[0];

printf("%x %d\n", code, code);

code=hangul2[1];

printf("%x %d\n", code, code);

code=hangul2[2];

printf("%x %d\n\n", code, code);

return 0;

}

문자열

• 문자와 문자열

① 문자 : ‘a'

② 문자열 : "Tom"

③ 문자열의 크기를 재는 함수 : strlen()

/* sample8.c */

#include <stdio.h>

#include <string.h>

#define TELE "your telephone number is"

int main(void)

{

char name[50], num[10];

printf("Input your name \n");

scanf("%s", name);

printf("Input your telephone number \n");

scanf("%s", num);

printf("Hi, %s, %s %s ! \n", name, TELE, num);

printf("%s has %d byte length \n", name, strlen(name));

return 0;

}

- 문자열 입력함수: gets()

[부록 5] p.697 - p.698

입력할 문자열에 공백포함 가능

Enter키를 누르면 ‘\0’를 문자열 마지막에 추가하여 입력문자열로 바꿈.

• [본문] p.32 - p.67 : [PPT 2-2] Chap02

- 배열(array), 포인터의 이해

- 조건문(if), 반복문, 함수의 이해

- [C 콘서트] Chap 10 참조